home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / COMMADIO / RBBS2.LZH / RBBS-PC.BAS < prev   
BASIC Source File  |  1986-03-15  |  191KB  |  5,501 lines

  1. 3 ' $linesize: 132
  2. 4 ' $title: 'RBBS CPC14-1A, Copyright 1986 by D. Thomas Mack'
  3. 5 ' WARNING !!! DO NOT CHANGE, BYPASS OR REMOVE LINES 3-31
  4. 9 'by D. Thomas Mack                &   Jon J. Martin
  5. 10 '   The Second Ring                  Aircomm
  6. 11 '   10210 Oxfordshire Road           4396 N. Prairie Willow Ct.
  7. 12 '   Great Falls, Virginia 22066      Concord, California 94521
  8. 13 '
  9. 14 ' *******************************NOTICE*************************************
  10. 15 ' *  A limited license is granted to all users of this program and it's    *
  11. 16 ' *  companion program, CONFIG (version 1.95), to make copies of this      *
  12. 17 ' *  program and distribute the copies to other users, on the following    *
  13. 18 ' *  conditions:                                                           *
  14. 19 ' *    1.   The notices contained in lines 3 through 59 of the program     *
  15. 20 ' *         are not altered, bypassed, or removed.                         *
  16. 21 ' *    2.   The program is not to be distributed to others in modified     *
  17. 22 ' *         form (i.e. the line numbers must remain the same).             *
  18. 23 ' *    3.   No fee is to be charged (or any other consideration received)  *
  19. 24 ' *         for copying or distributing these programs without an express  *
  20. 25 ' *         written agreement with D. Thomas Mack, The Second Ring, 10210  *
  21. 26 ' *         Oxfordshire Road, Great falls, Virginia 22006                  *
  22. 27 ' *                                                                        *
  23. 28 ' *   Copyright (c) 1983, 1984, 1985, 1986 D. Thomas Mack, The Second Ring *
  24. 29 ' **************************************************************************
  25.    '
  26.    ' $INCLUDE: 'RBBS-VAR.BAS'
  27.    '
  28. ' $SUBTITLE: 'Main-line RBBS-PC Program'
  29.     CALL COPYWRIT
  30. 100 CLEAR:'                                               Erase all variables
  31.     ON ERROR GOTO 13000:'                                 Set ERROR trap
  32.     DEF SEG:'                                             Point to BASIC
  33.     CLS:'                                                 Clear Screen
  34.     WIDTH 80:'                                            Set Screen Width
  35.     SCREEN 0,0,0:'                                        Text, No color, Pg 0
  36.     KEY OFF:'                                             Line 25 turned off
  37.     DEFINT A-Z:'                                          All var. integer
  38.   ' ********************* Variable Definitions ********************************
  39.     ACKNOWLEDGE$ = CHR$(6)
  40.     ACTIVE.MESSAGE$=CHR$(225)
  41.     BACKSPACE$ = CHR$(8) + CHR$(32) + CHR$(8)
  42.     BACK.ARROW$ = CHR$(29) + CHR$(32) + CHR$(29)
  43.     CANCEL$ = CHR$(24)
  44.     COLOR.RESET$=CHR$(27)+"[00;37;40m"
  45.     CONFIG.FILENAME$ = "RBBS-PC.DEF"
  46.     CARRIAGE.RETURN$ = CHR$(13)
  47.     DELETED.MESSAGE$=CHR$(226)
  48.     END.TRANSMISSION$ = CHR$(4)
  49.     ESCAPE$ = CHR$(27)
  50.     FALSE = 0:'                                           Set FALSE condition
  51.     F1.KEY = 59
  52.     F10.KEY = 68
  53.     LINE.FEED$ = CHR$(10)
  54.     LINE.FEEDS = NOT FALSE
  55.     LOCK.STATUS$ = "UM UU UB UD"
  56.     NEGATIVE.ACKNOWLEDGE$ = CHR$(21)
  57.     OMNINET = 2:'
  58.     RIGHT.MARGIN = 72
  59.     RETURN.LINE.FEED$ = CARRIAGE.RETURN$ + LINE.FEED$
  60.     START.OF.HEADER$ = CHR$(1)
  61.     TIME.LOGGED.ON$ = SPACE$(8)
  62.     TRANSFER.OPTIONS$=" type <A)scii, <M>NP, <X>modem, <C>Xmodem/CRC, <N>one"
  63.     TRUE = NOT FALSE:'                                    Set TRUE condition
  64.     USER.DATA = FALSE
  65.     VERSION.ID$ = "CPC14.1A"
  66.     XOFF$ = CHR$(19)
  67.     XON$ = CHR$(17)
  68.   ' ******************** Logon Error Message Table ****************************
  69.     LG$(1) = "Registration Check Failed"
  70.     LG$(2) = "Sysop name attempted"
  71.     LG$(3) = "Locked out attempt"
  72.     LG$(4) = "Password Attempt Failed"
  73.     LG$(5) = "Auto Lockout done"
  74.     LG$(6) = "Name in use on another Node! "
  75.     LG$(7) = "300 Baud access not allowed!"
  76.     CALL GETCOMND
  77.     CALL READDEF
  78.  
  79. '
  80. ' *****************************************************************************
  81. ' *  INITIALIZE OMNINET INTERFACE IF OMNINET IN USE                           *
  82. ' *****************************************************************************
  83. '
  84. 128 IF NETWORK.TYPE = OMNINET THEN _
  85.        CN$ = SPACE$(535) : _
  86.        CALL INITIO(A)
  87. '
  88. ' *****************************************************************************
  89. ' *  ESTABLISH NEXT CALLERS FILE RECORD AVAILABLE                             *
  90. ' *****************************************************************************
  91. '
  92.     GOSUB 56000
  93.     CALLERS.FILE.INDEX = LOF(4) / 64
  94. 130 GET 4,CALLERS.FILE.INDEX
  95.     IF LEFT$(CALLERS.RECORD$,13) = STRING$(13,0) THEN _
  96.        CALLERS.FILE.INDEX = CALLERS.FILE.INDEX-1 : _
  97.        GOTO 130
  98. '
  99. ' *****************************************************************************
  100. ' *  TEST FOR MESSAGE FILE PRESENT (ABORT IF NOT PRESENT)                     *
  101. ' *****************************************************************************
  102. '
  103. 135 ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$
  104.     ACTIVE.USER.FILE$ = MAIN.USER.FILE$
  105.     GOSUB 4910
  106.     GET 1,NODE.RECORD.INDEX
  107. '
  108. ' *****************************************************************************
  109. ' *  GET CURRENT STATUS OF SYSOP AVAIL, SYSOP ANNOY, SYSOP NEXT, & PRINTER    *
  110. ' *****************************************************************************
  111. '
  112.     SYSOP.AVAILABLE = VAL(MID$(MESSAGE.RECORD$,32,2))
  113.     SYSOP.ANNOY = VAL(MID$(MESSAGE.RECORD$,34,2))
  114.     SYSOP.NEXT = VAL(MID$(MESSAGE.RECORD$,36,2))
  115.     PRINTER = VAL(MID$(MESSAGE.RECORD$,38,2))
  116.     EXIT.TO.DOORS = VAL(MID$(MESSAGE.RECORD$,40,2))
  117.     SNOOP = VAL(MID$(MESSAGE.RECORD$,58,2))
  118.     MID$(MESSAGE.RECORD$,57,1)="I"
  119.     PUT 1,NODE.RECORD.INDEX
  120.     GOSUB 12985
  121. '
  122. ' *****************************************************************************
  123. ' *  TEST FOR COLOR GRAPHICS MONITOR AND ANSI.SYS SUPPORT TO ALLOW THE LOCAL  *
  124. ' *  SYSOP TO SEE THE SAME COLOR MENUS AND SCREENS THAT THE REMOTE USER SEES  *
  125. ' *****************************************************************************
  126. '
  127.     DEF SEG = 0
  128.     IF (PEEK(&H410) AND &H30) <> &H30 AND _
  129.        USE.COLOR THEN _
  130.        COLOR.SUPPORT = TRUE : _
  131.        A$ = COLOR.RESET$ : _
  132.        LOCAL.USER = TRUE : _
  133.        GOSUB 12979 : _
  134.        LOCAL.USER = FALSE
  135. '
  136. ' *****************************************************************************
  137. ' *  TEST FOR MULTI LINK PRESENT IF NOT COMPAQ COMPUTER                       *
  138. ' *****************************************************************************
  139. '
  140.     IF COMPUTER.TYPE <> 1 THEN _
  141.        MULTI.LINK.PRESENT = PEEK(&H1FE) + 256*PEEK(&H1FF) : _
  142.        IF MULTI.LINK.PRESENT > 0 THEN _
  143.           DEF SEG = MULTI.LINK.PRESENT : _
  144.           MULTI.LINK.COM.PORT = (&H64 + PEEK(&H58) + 256*PEEK(&H59) + &HC) : _
  145.           IF PEEK(MULTI.LINK.COM.PORT) = &H1 OR &H2 THEN _
  146.              POKE (MULTI.LINK.COM.PORT),&H9
  147. '
  148. ' *****************************************************************************
  149. ' *  RESET MULTI LINK SPECIAL PARAMETERS TO NORMAL (NOT EXIT TO DOORS)        *
  150. ' *****************************************************************************
  151. '
  152.     DEF SEG
  153.     IF MULTI.LINK.PRESENT THEN _
  154.        AX = &HB00 : _                   ' Turn off ML's carrier monitoring.
  155.        BX = 0 : _
  156.        GOSUB 60510 : _
  157.        AX = &H701 : _                   ' Change terminal type to ML type 1.
  158.        BX = 0 : _
  159.        GOSUB 60510 : _
  160.        AX = &H1 : _                     ' Conditionally enque on comm. port
  161.        GOSUB 60505
  162.     IF NOT MNP.SUPPORT THEN _
  163.        TRANSFER.OPTIONS$ = MID$(TRANSFER.OPTIONS$,1,14) + _
  164.                            MID$(TRANSFER.OPTIONS$,22)
  165. '
  166. ' *****************************************************************************
  167. ' *  DISPLAY RBBS-PC MAIN FUNCTION KEY DISPLAY                                *
  168. ' *****************************************************************************
  169. '
  170. 170 CLS
  171.     PRINT "RBBS-PC VERSION ";VERSION.ID$;" Node ";NODE.ID$
  172.     PRINT "Free memory: "; FRE("A")
  173.     PRINT"Press:"
  174.     FOR FUNCTION.KEY.INDEX = 1 TO 12
  175.       PRINT SYSOP.FUNCTION.KEY$(FUNCTION.KEY.INDEX)
  176.       IF FUNCTION.KEY.INDEX < 11 THEN _
  177.          KEY FUNCTION.KEY.INDEX,""
  178.     NEXT
  179. '
  180. ' *****************************************************************************
  181. ' * IF RUNNING MORE THAN ONE NODE IN A DOS 3.X ENVIRONMENT (OR HIGHER) UNDER  *
  182. ' * MULTILINK, THEN SET THE "SHARE.IT" INDICATOR ON SO THAT ALL FILES CAN BE  *
  183. ' * ACCESSED BY ALL PARTITIONS IN A MULTI-TASKING ENVIRONMENT (I.E. MULTI-    *
  184. ' * LINK).                                                                    *
  185. ' *****************************************************************************
  186. '
  187. '    IF DOS.VERSION > 2 AND _
  188. '       MAXIMUM.NUMBER.OF.NODES > 1 AND _
  189. '       MULTI.LINK.PRESENT THEN _
  190. '          SHARE.IT = TRUE
  191. '
  192. ' *****************************************************************************
  193. ' *  DISPLAY CURRENT STATUS OF SYSOP AVAIL, SYSOP ANNOY, SYSOP NEXT, & PRINTER*
  194. ' *****************************************************************************
  195. '
  196. 175 GOSUB 30500
  197.     SUBROUTINE.PARAMETER = 2
  198.     CALL LINE25
  199. '
  200. ' *****************************************************************************
  201. ' * WAIT FOR THE PHONE TO RING AND ANSWER IT                                  *
  202. ' *****************************************************************************
  203.     SUBROUTINE.PARAMETER = 1
  204. 200 CALL ANSWERIT
  205.     IF EC > 1 THEN _
  206.        GOTO 13000
  207.     ON SUBROUTINE.PARAMETER GOTO 410,330,826,10595,13540,202
  208. 202 GOSUB 60010
  209.     SUBROUTINE.PARAMETER = 3
  210.     GOTO 200
  211. '
  212. ' *****************************************************************************
  213. ' *  DETERMINE BAUD RATE                                                      *
  214. ' *****************************************************************************
  215. '
  216. 330 GOSUB 21280
  217.     IF BAUD.TEST = 0 OR BAUD.TEST = 300 THEN _
  218.        BAUD.RATE.DIVISOR = &H180 : _
  219.        BPS = -1 : _
  220.        GOTO 331
  221.     IF BAUD.TEST = 1200 OR BAUD.TEST = 2400 THEN _
  222.        BPS = -2-(BAUD.TEST / 1200) : _
  223.        BAUD.RATE.DIVISOR = 48 * (BPS + 5) : _
  224.        GOTO 331
  225.     IF BAUD.TEST = 4800 OR BAUD.TEST = 9600 THEN _
  226.        BPS = -4-(BAUD.TEST /4800) : _
  227.        BAUD.RATE.DIVISOR = 12 * (BPS + 7) : _
  228.        GOTO 331
  229.     SUBROUTINE.PARAMETER = 2 : _
  230.     GOTO 200
  231. 331 CALL SETBAUD
  232. '
  233. ' *****************************************************************************
  234. ' *  DISPLAY WELCOME LINE                                                     *
  235. ' *****************************************************************************
  236. '
  237. 345 SUBROUTINE.PARAMETER = 1
  238.     CALL AMORPM
  239.     CALL FINDTIME (USER.LOGON.TIME!)
  240.     TIME.LOGGED.ON$ = TIME$
  241.     A$ = "WELCOME TO " + RBBS.NAME$ + CARRIAGE.RETURN$
  242.     GOSUB 12976
  243.     TEST.PARITY = TRUE
  244.     FILE.NAME$ = LEFT$(WELCOME.FILE$,2) + "PRELOG"
  245. 346 CALL FINDIT
  246.     IF NOT OK THEN _
  247.        GOTO 400
  248. 347 BYPASS.TIME.CHECK = TRUE
  249.     GOSUB 43030
  250.     GOSUB 6000
  251.     BYPASS.TIME.CHECK = FALSE
  252.     FF = FALSE
  253. '
  254. ' *****************************************************************************
  255. ' *  GET USER NAME                                                            *
  256. ' *  C - COMMAND FROM NEWUSER REGISTER OPTIONS (CHANGE NAME OR ADDRESS)       *
  257. ' *****************************************************************************
  258. '
  259. 400 UPPER.CASE = FALSE
  260.     A1$ = "What is your "
  261.     GOSUB 12500
  262.     CALL COMMINFO
  263.     IF FF THEN _
  264.        LOGON.ERROR.INDEX = 1 : _
  265.        GOTO 10620
  266.     IF RESTRICT.BAUD = -1 AND BPS = -1 THEN _
  267.        LOGON.ERROR.INDEX = 7 : _
  268.        GOTO 10620
  269. '
  270. ' *****************************************************************************
  271. ' *  CHECK IF SAME USER ON ANOTHER NODE                                       *
  272. ' *****************************************************************************
  273. '
  274. 410 FOR NODE.INDEX = 2 TO NODES.IN.SYSTEM + 1
  275.       GET 1,NODE.INDEX
  276.       IF INSTR(MESSAGE.RECORD$,ACTIVE.USER.NAME$) THEN _
  277.          IF MID$(MESSAGE.RECORD$,57,1) = "A" THEN _
  278.             LOGON.ERROR.INDEX = 6 : _
  279.             LG$(6) = LG$(6) + LEFT$(MESSAGE.RECORD$,25) : _
  280.             GOTO 10620 _
  281.          ELSE A$ = "Welcome back, " + _
  282.                     LEFT$(MESSAGE.RECORD$,INSTR(MESSAGE.RECORD$," ")-1) + _
  283.                     "!" : _
  284.               GOSUB 12976 : _
  285.               GOTO 430
  286. 420 NEXT
  287. '
  288. ' *****************************************************************************
  289. ' *  TEST FOR REMOTE SYSOP LOGGING ON                                         *
  290. ' *****************************************************************************
  291. '
  292. 430 GET 1,NODE.RECORD.INDEX
  293.     LL = (ACTIVE.USER.NAME$ = LEFT$(MESSAGE.RECORD$,LEN(ACTIVE.USER.NAME$)))
  294.     IF FIRST.NAME$ = SYSOP.PASSWORD.1$ AND _
  295.        LAST.NAME$ = SYSOP.PASSWORD.2$ THEN _
  296.        UPPER.CASE = FALSE : _
  297.        CI$ = "REMOTE" : _
  298.        GOTO 827
  299. '
  300. ' *****************************************************************************
  301. ' *  TEST FOR SYSOP NAME ATTEMPT                                              *
  302. ' *****************************************************************************
  303. '
  304. 445 IF INSTR(ACTIVE.USER.NAME$,"SYSOP") OR _
  305.        INSTR(ACTIVE.USER.NAME$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$) THEN _
  306.        LOGON.ERROR.INDEX = 2 : _
  307.        GOTO 10620
  308. '
  309. ' *****************************************************************************
  310. ' *  REMOVE INVALID CHARACTERS FROM USER NAME                                 *
  311. ' *****************************************************************************
  312. '
  313. 455 FOR J = 1 TO LEN(ACTIVE.USER.NAME$)
  314.       X = ASC(MID$(ACTIVE.USER.NAME$,J,1))
  315.       IF (X < 65 OR X > 90) AND _
  316.          (X <> 32 AND X <> 39 AND X <> 45 AND X <> 46) THEN _
  317.          GOTO 400
  318. 465 NEXT
  319. '
  320. ' *****************************************************************************
  321. ' *  CHECK FOR ACTIVE USER                                                    *
  322. ' *****************************************************************************
  323. '
  324.     TEMP.USER.NAME$ = ACTIVE.USER.NAME$
  325.     GOSUB 12600
  326.     IF NOT FOUND THEN _
  327.        GOTO 700
  328.     GOSUB 12984
  329. '
  330. ' *****************************************************************************
  331. ' *  ACTIVE USER FOUND                                                        *
  332. ' *****************************************************************************
  333. '
  334.     GOSUB 9500
  335.     USER.FILE.INDEX = LOC(2)
  336.     IF USER.SECURITY.LEVEL < MINIMUM.LOGON.SECURITY THEN _
  337.        GOTO 725
  338.     GOSUB 12989
  339.     CI$ = CITY.STATE$
  340.     ATTEMPTS.ALLOWED = 4
  341.     PASSWORD.SAVE$ = PASSWORD$
  342.     MESSAGE.PASSWORD = FALSE
  343.     IF CURRENT.DATE$ <> LEFT$(LAST.DATE.TIME.ON$,8) THEN _
  344.        ELAPSED.TIME = 0 _
  345.     ELSE ELAPSED.TIME = CVI(ELAPSED.TIME$)
  346. 480 IF Q = 3 THEN _
  347.        Z$ = B$(3) : _
  348.        ATTEMPTS = 1 : _
  349.        GOSUB 677 _
  350.     ELSE GOSUB 675
  351. 630 IF PASSWORD.FAILED THEN _
  352.        LOGON.ERROR.INDEX = 4 : _
  353.        GOTO 10620
  354. 643 GOSUB 41070
  355.     NEW.USER = FALSE
  356.     LMM$ = RIGHT$(STR$(ASC(MID$(LIST.NEW.DATE$,2))),2) + _   ' MM
  357.            "/" + _
  358.            RIGHT$(STR$(ASC(MID$(LIST.NEW.DATE$,3))),2) + _   ' DD
  359.            "/" + _
  360.            RIGHT$(STR$(ASC(LIST.NEW.DATE$)),2)               ' YY
  361.     LM$ = RIGHT$(LMM$,2) + _                                 ' YY
  362.           LEFT$(LMM$,2) + _                                  ' MM
  363.           MID$(LMM$,4,2)                                     ' DD
  364.     IF MID$(LM$,3,1) = " " THEN _
  365.        MID$(LM$,3,1) = "0"
  366. 655 IF MID$(LM$,5,1) = " " THEN _
  367.        MID$(LM$,5,1) = "0"
  368. 660 GOTO 800
  369. '
  370. ' *****************************************************************************
  371. ' *  USER & MESSAGE PASSWORD VALIDATION                                       *
  372. ' *****************************************************************************
  373. '
  374. 665 IF PASSWORD.SAVE$ = PASSWORD$ THEN _
  375.        PASSWORD.FAILED = 0 : _
  376.        RETURN
  377. 667 ATTEMPTS = 0
  378. 670 ATTEMPTS = ATTEMPTS + 1
  379.     IF ATTEMPTS > ATTEMPTS.ALLOWED THEN _
  380.        PASSWORD.FAILED = TRUE : _
  381.        RETURN
  382. 675 A$ = "Enter Password (dots will echo)"
  383.     GOSUB 45010
  384.     Z$ = B$(1)
  385. 677 IF LEN(Z$) > 15 THEN _
  386.        GOTO 680
  387.     CALL ALLCAPS (Z$)
  388.     Z$ = Z$ + SPACE$(15-LEN(Z$))
  389.     IF PASSWORD.SAVE$ = Z$ THEN _
  390.        PASSWORD.FAILED = 0 : _
  391.        RETURN
  392. 680 IF MESSAGE.PASSWORD THEN _
  393.        A$ = "Wrong password entered!" : _
  394.        GOSUB 12979
  395.     GOTO 670
  396. '
  397. ' *****************************************************************************
  398. ' *  ACTIVE USER NOT FOUND (NEWUSER ROUTINE)                                  *
  399. ' *****************************************************************************
  400. '
  401. 700 IF RESTRICT.BAUD = -2 AND BPS = -1 THEN _
  402.        LOGON.ERROR.INDEX = 7 : _
  403.        A$ = "(300 BAUD ACCESS FOR REGISTERED USERS ONLY)  " : _
  404.        GOSUB 12976 : _
  405.        GOTO 10620
  406.     Z$ = FIRST.NAME$
  407.     GOSUB 12570
  408.     IF FOUND THEN _
  409.        GOSUB 12984 : _
  410.        GOTO 12595
  411.     Z$ = LAST.NAME$
  412.     GOSUB 12570
  413.     IF FOUND THEN _
  414.        GOSUB 12984 : _
  415.        GOTO 12595
  416. 710 IF USER.FILE.INDEX = 0 THEN _
  417.        GOTO 13540
  418. 720 NEW.USER = TRUE
  419.     GOSUB 9400
  420.     GOSUB 12630
  421.     LSET USER.NAME$ = "NEWUSER"
  422.     PUT 2,USER.FILE.INDEX
  423.     USER.SECURITY.LEVEL = DEFAULT.SECURITY.LEVEL
  424. 725 IF USER.SECURITY.LEVEL < MINIMUM.LOGON.SECURITY OR _
  425.        FIRST.NAME$ = LAST.NAME$ THEN _
  426.        LOGON.ERROR.INDEX = 3 : _
  427.        GOTO 10620
  428. 730 GOSUB 12950
  429.     USER.RECORD.SAVE$ = USER.RECORD$
  430.     BYPASS.TIME.CHECK = TRUE
  431.     FILE.NAME$ = NEWUSER.FILE$
  432.     STOP.INTERRUPTS = FALSE
  433.     GOSUB 1790
  434.     STOP.INTERRUPTS = TRUE
  435.     BYPASS.TIME.CHECK = FALSE
  436.     GOSUB 9400
  437.     LSET USER.RECORD$ = USER.RECORD.SAVE$
  438.     A$ = ACTIVE.USER.NAME$ + " from " + CITY.STATE$
  439.     GOSUB 12979
  440. 740 A$ = "<C>hange name/address, <D>isconnect (don't register), <R>egister"
  441.     GOSUB 12995
  442.     CALL ALLCAPS (B$(1))
  443.     Z$ = B$(1)
  444.     S = INSTR("CDR",Z$)
  445. 745 ON S GOTO 747,750,755
  446.     GOTO 740
  447. 747 Z$ = ACTIVE.USER.NAME$ + " from " + CI$ + " changed Name/Address"
  448.     SUBROUTINE.PARAMETER = 2
  449.     CALL UPDTCALR
  450.     LSET USER.NAME$ = STRING$(31,0)
  451.     PUT 2,USER.FILE.INDEX
  452.     GOSUB 12991
  453.     FF = FALSE
  454.     GOTO 400
  455. '
  456. ' *****************************************************************************
  457. ' *  D - COMMAND FROM NEWUSER ROUTINE (DISCONNECT - REFUSE TO REGISTER)       *
  458. ' *****************************************************************************
  459. '
  460. 750 Z$ = ACTIVE.USER.NAME$ + " of " + CI$ + " refused to register"
  461.     SUBROUTINE.PARAMETER = 2
  462.     CALL UPDTCALR
  463.     LSET USER.NAME$ = STRING$(31,0)
  464.     PUT 2,USER.FILE.INDEX
  465.     GOSUB 12991
  466.     FF = FALSE
  467.     USER.FILE.INDEX = 0
  468.     GOTO 13540
  469. '
  470. ' *****************************************************************************
  471. ' *  R - COMMAND FROM NEWUSER ROUTINE (REGISTER)                              *
  472. ' *****************************************************************************
  473. '
  474. 755 GOSUB 12800
  475.     A$ = "Re-enter PASSWORD for verification (Dots will Echo)"
  476.     GOSUB 45010
  477.     SWAP Z$,B$(1)
  478.     CALL ALLCAPS (Z$)
  479.     IF B$(1) <> Z$ THEN _
  480.        A$ = "Passwords Don't match!" : _
  481.        GOSUB 12979 : _
  482.        GOTO 755
  483. 760 CALL ALLCAPS (Z$)
  484.     LSET PASSWORD$ = Z$
  485.     A$ = "Please REMEMBER your password"
  486.     GOSUB 12976
  487.     TEMP.SECURITY.LEVEL = USER.SECURITY.LEVEL
  488.     GOSUB 42950
  489.     BYPASS.TIME.CHECK = TRUE
  490.     GOSUB 43000
  491.     BYPASS.TIME.CHECK = FALSE
  492.     GOSUB 43030
  493.     GOSUB 42800
  494.     GOSUB 42700
  495.     GOSUB 12900
  496.     RIGHT.MARGIN = 64
  497.     EXPERT.USER = FALSE
  498.     GOSUB 9600
  499. '
  500. ' *****************************************************************************
  501. ' *  LOGIN ALL USERS                                                          *
  502. ' *****************************************************************************
  503. '
  504. 800 MAIN.USER.FILE.INDEX = USER.FILE.INDEX
  505.     USER.SECURITY.SAVE = USER.SECURITY.LEVEL
  506.     A$ = "Logging " + ACTIVE.USER.NAME$
  507.     GOSUB 12975
  508.     TIMES.LOGGED.ON = CVI(MID$(USER.OPTIONS$,1,2)) + 1
  509.     GOSUB 9500
  510.     A1$ = LAST.DATE.TIME.ON$
  511.     A$ = "RBBS-PC VERSION " + _
  512.           VERSION.ID$ + _
  513.           " NODE " + _
  514.           NODE.ID$ + _
  515.           RETURN.LINE.FEED$ + _
  516.           " OPERATING AT " + _
  517.           BAUD.PARITY$
  518.     ATTEMPTS = 0
  519.     GOSUB 12976
  520. 815 DOWNLOADS = CVI(USER.DOWNLOADS$)
  521.     UPLOADS = CVI(USER.UPLOADS$)
  522.     LAST.MESSAGE.READ = -LAST.MESSAGE.READ*(LAST.MESSAGE.READ <= HIGH.MESSAGE.NUMBER)
  523.     LSET USER.OPTIONS$ = MKI$(TIMES.LOGGED.ON) + _
  524.                          MID$(USER.OPTIONS$,3)
  525.     LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + " " + TIME.LOGGED.ON$
  526.     PUT 2,USER.FILE.INDEX
  527.     GOSUB 12991
  528.     DEF SEG = 0
  529.     IF (PEEK(&H410) AND &H30) <> &H30 THEN _
  530.        DEF SEG : _
  531.        SCREEN ,,1,0 : _
  532.        CLS : _
  533.        GOSUB 33900 : _
  534.        SCREEN ,,0,0
  535.     DEF SEG
  536.     IF NOT LL THEN _
  537.        STOP.INTERRUPTS = WELCOME.INTERRUPTABLE : _
  538.        BYPASS.TIME.CHECK = TRUE : _
  539.        FILE.NAME$ = WELCOME.FILE$ : _
  540.        GOSUB 43030 : _
  541.        GOSUB 6000 : _
  542.        BYPASS.TIME.CHECK = FALSE : _
  543.        STOP.INTERRUPTS = FALSE
  544. 816 IF NEW.USER THEN _
  545.        BYPASS.TIME.CHECK = TRUE : _
  546.        GOSUB 1700 : _
  547.        BYPASS.TIME.CHECK = FALSE _
  548.     ELSE A$ = "Times on:" + STR$(TIMES.LOGGED.ON) : _
  549.          GOSUB 12979 : _
  550.          A$ = "Last time on was: " + A1$ : _
  551.          GOSUB 12979
  552. 817 IF REMIND.FILE.TRANSFERS THEN _
  553.        A$ = "Files Downloaded:" + _
  554.             STR$(DOWNLOADS) + _
  555.             "  Uploaded:" + _
  556.             STR$(UPLOADS) : _
  557.        GOSUB 12977
  558. 820 IF REMIND.PROFILE THEN _
  559.        GOSUB 5400
  560. 825 CI$ = LEFT$(CI$ + SPACE$(2),INSTR(CI$ +SPACE$(2),SPACE$(2))-1)
  561.     GOTO 830
  562. '
  563. ' *****************************************************************************
  564. ' *  ESC PRESSED ON LOCAL CONSOLE ENTERS HERE                                 *
  565. ' *****************************************************************************
  566. '
  567. 826 CALL FINDTIME (USER.LOGON.TIME!)
  568.     GOSUB 14500
  569.     LOCAL.USER = TRUE
  570.     WAIT.BEFORE.DISCONNECT = 32400
  571.     IF LOCAL.PASSWORD$ <> "NONE" THEN _
  572.        LOCATE 24,1 : _
  573.        INPUT "Enter PASSWORD";Z$ : _
  574.        CALL ALLCAPS (Z$) : _
  575.        IF Z$ <> LOCAL.PASSWORD$ THEN _
  576.           GOTO 13549
  577.     EIGHT.BIT = TRUE
  578.     GR = 1
  579.     CI$ = "LOCAL"
  580.     LINE.FEEDS = TRUE
  581.     RETURN.LINE.FEED$ = LINE.FEED$
  582.     USER.SECURITY.LEVEL = SYSOP.SECURITY.LEVEL
  583. 827 FIRST.NAME$ = SYSOP.FIRST.NAME$
  584.     LAST.NAME$ = SYSOP.LAST.NAME$
  585.     ACTIVE.USER.NAME$ = "SYSOP"
  586.     USER.SECURITY.LEVEL = SYSOP.SECURITY.LEVEL
  587.     SYSOP = TRUE
  588.     RIGHT.MARGIN = 72
  589.     SUBROUTINE.PARAMETER = 1
  590.     CALL AMORPM
  591.     IF LOCAL.USER THEN _
  592.        SNOOP = TRUE : _
  593.        SYSOP.NEXT = TRUE : _
  594.        GOSUB 33090
  595. 830 IF USER.SECURITY.LEVEL <> DEFAULT.SECURITY.LEVEL THEN _
  596.        Z$ = "" : _
  597.        Z = 0 : _
  598.        GOSUB 5140 : _
  599.        IF FOUND THEN _
  600.           MINUTES.PER.SESSION! = TEMP.TIME.ALLOWED
  601. 836 IF LOCAL.USER THEN _
  602.        IF PRINTER THEN _
  603.           Z$= "  Sysop on locally at "+CURRENT.DATE$+", "+TIM$ : _
  604.           CALL PRINTIT
  605. 837 IF NOT LOCAL.USER THEN _
  606.        Z$ = ACTIVE.USER.NAME$ + _
  607.             " on at " + _
  608.             CURRENT.DATE$ + _
  609.             ", " + _
  610.             TIM$ + _
  611.             " from " + _
  612.             CI$ + _
  613.             ", " + _
  614.             BAUD.PARITY$ : _
  615.        NG$ = Z$ + SPACE$(128-LEN(Z$)) : _
  616.        Z$ = "  " + Z$ : _
  617.        CALL PRINTIT : _
  618.        IF NEW.USER THEN _
  619.           Z$ = "NEWUSER" : _
  620.           SUBROUTINE.PARAMETER = 1 : _
  621.           CALL UPDTCALR
  622.     NEW.USER = FALSE
  623. 842 SECONDS.PER.SESSION! = (MINUTES.PER.SESSION! + LIMIT.DAILY.TIME * ELAPSED.TIME) * 60
  624.     GOSUB 4910
  625.     CALLS.TODATE! = CALLS.TODATE! + 1 + SYSOP
  626.     GOSUB 24000
  627.     GET 1,NODE.RECORD.INDEX
  628.     MID$(MESSAGE.RECORD$,1,31) = ACTIVE.USER.NAME$ + SPACE$(31-LEN(ACTIVE.USER.NAME$))
  629.     MID$(MESSAGE.RECORD$,57,1) = "A"
  630.     MID$(MESSAGE.RECORD$,60,4) = BAUD.PARITY$
  631.     PUT 1,NODE.RECORD.INDEX
  632.     GOSUB 12985
  633.     IF SYSOP THEN _
  634.        GOTO 900 _
  635.     ELSE SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  636.     SUBROUTINE.PARAMETER = 2
  637. 850 CALL LINE25
  638.     IF USER.SECURITY.LEVEL < MAIN.FUNCTION (1) THEN _
  639.        GOTO 900
  640.     IF ACTIVE.BULLETINS < 1 THEN _
  641.        A$ = "There are no bulletins today" : _
  642.        GOSUB 1397 : _
  643.        GOTO 900
  644. 855 IF BULLETINS.OPTIONAL THEN _
  645.        A$ = "Would you like to skip the" + STR$(ACTIVE.BULLETINS) + " bulletins" : _
  646.        CALL SKIPLINE : _
  647.        GOSUB 12995 : _
  648.        IF YES THEN _
  649.           GOTO 900
  650. 860 GOSUB 9705
  651. 900 GOSUB 1900
  652.     SUBROUTINE.PARAMETER = 2
  653.     CALL LINE25
  654.     GOTO 955
  655. 955 GOSUB 4850
  656.     STOP.INTERRUPTS = TRUE
  657. '
  658. ' *****************************************************************************
  659. ' *                                                                           *
  660. ' *                           MAIN MENU PROCESSING                            *
  661. ' *                                                                           *
  662. ' *****************************************************************************
  663. '
  664. 1200 CLOSE 1
  665.      ACTIVE.MENU$ = "M"
  666.      SUBROUTINE.PARAMETER = 1
  667.      CALL LINE25
  668.      STOP.INTERRUPTS = TRUE
  669.      Q = 0
  670.      GOSUB 12979
  671.      IF USER.SECURITY.LEVEL < SYSOP.MENU.SECURITY.LEVEL THEN _
  672.         A1$ = ">" : _
  673.         GOTO 1240
  674.      A1$ = ",1,..,7>"
  675.      IF NOT EXPERT.USER THEN _
  676.         FILE.NAME$ = MENU$(1) : _
  677.         GOSUB 43025
  678. 1240 GOSUB 41050
  679.      NON.STOP = FALSE
  680.      IF NOT EXPERT.USER THEN _
  681.         FILE.NAME$ = MENU$(2) : _
  682.         GOSUB 43025
  683. 1250 SUBROUTINE.PARAMETER = 1
  684.      CALL LINE25
  685.      A$ = GRN$ + " Main Functions <B,C,D,E,F,G,H,I,J,K,L,O,P,Q,R,S,U,V,W,X,?" + A1$
  686.      CALL SKIPLINE
  687.      GOSUB 12995
  688.      IF Q = 0 THEN _
  689.         GOTO 1250
  690. 1270 FOR J = 1 TO Q
  691.        Z$ = B$(J)
  692.        CALL ALLCAPS (Z$)
  693.        FF = VAL(Z$)
  694.        IF FF = 0 THEN _
  695.           GOTO 1280
  696.        IF FF < 1 OR FF > 7 THEN _
  697.           GOSUB 1350 : _
  698.           GOTO 1200
  699. 1274   IF USER.SECURITY.LEVEL < SYSOP.FUNCTION(FF) THEN _
  700.           VIOLATION$ = "Sysop " + Z$ : _
  701.           GOSUB 1380 : _
  702.           GOTO 1200
  703. 1276   ON FF GOSUB 10070, _              ' 1) List comments file
  704.                    10090, _              ' 2) List callers file
  705.                    10390, _              ' 3) Recover a message
  706.                    10530, _              ' 4) Erase comments
  707.                    11000, _              ' 5) User file maintenance
  708.                    33070, _              ' 6) Toggle page bell on/off
  709.                    10930                 ' 7) Exit to DOS 2.x or above
  710.        GOTO 1200
  711. 1280   FF = INSTR("BCDEFGHIJKLOPQRSUVWX?",Z$)
  712.        IF FF = 0 THEN _
  713.           GOSUB 1350 : _
  714.           GOTO 1200
  715. 1290   IF USER.SECURITY.LEVEL < MAIN.FUNCTION(FF) THEN _
  716.           VIOLATION$ = "MMenu " + Z$ : _
  717.           GOSUB 1380 : _
  718.           GOTO 1200
  719. 1320   ON FF GOSUB 9700, _               ' B)ulletins
  720.                    1800, _               ' C)omments
  721.                    10970, _              ' D)oor (exit to)
  722.                    2000, _               ' E)nter a message
  723.                    20015, _              ' F)ile system (exit to)
  724.                    10560, _              ' G)oodbye
  725.                    1740, _               ' H)elp (on line)
  726.                    1760, _               ' I)nitial welcome redisplayed
  727.                    5300, _               ' J)oin a conference
  728.                    3900, _               ' K)ill a message
  729.                    5200, _               ' L)ines per page
  730.                    4700, _               ' O)perator page
  731.                    1900, _               ' P)ersonal mail (look for)
  732.                    4320, _               ' Q)uick scan of messages
  733.                    4330, _               ' R)ead messages
  734.                    4340, _               ' S)can messages
  735.                    1330, _               ' U)tilities (exit to)
  736.                    5800, _               ' V)iew a conference
  737.                    9800, _               ' W)ho's on other nodes displayed
  738.                    4240, _               ' X)Expert mode toggle on/off
  739.                    1700                  ' ?)Display main menu functions
  740.      NEXT
  741.      GOTO 1200
  742. '
  743. ' *****************************************************************************
  744. ' *                                                                           *
  745. ' *                        UTILITY MENU PROCESSING                            *
  746. ' *                                                                           *
  747. ' *****************************************************************************
  748. '
  749. 1330 ACTIVE.MENU$ = "U"
  750.      GOSUB 41050
  751.      IF NOT EXPERT.USER THEN _
  752.         FILE.NAME$ = MENU$(4) : _
  753.         GOSUB 43025
  754. 1334 SUBROUTINE.PARAMETER = 1
  755.      CALL LINE25
  756.      A$ = GRN$ + " Utility Functions <B,C,F,G,H,L,M,N,P,Q,R,S,T,U,X,!>"
  757.      CALL SKIPLINE
  758.      GOSUB 12995
  759.      IF Q = 0 THEN _
  760.         GOSUB 1350 : _
  761.         GOTO 1330
  762. 1336 Z$ = B$(J)
  763.      CALL ALLCAPS (Z$)
  764.      FF = INSTR("BCFGHLMNPQRSTUX!",Z$)
  765.      IF FF = 0 THEN _
  766.         GOSUB 1360 : _
  767.         GOTO 1330
  768.      IF USER.SECURITY.LEVEL < UTILITY.FUNCTION(FF) THEN _
  769.         VIOLATION$ = "Util " + Z$ : _
  770.         GOSUB 1380 : _
  771.         GOTO 1330
  772. 1338 ON FF GOSUB 5500, _                 ' B)aud rate change 300==>450
  773.                  42960, _                ' C)ase change (upper or upper/lower)
  774.                  42800, _                ' F)ile transfer protocol
  775.                  43000, _                ' G)raphics
  776.                  1780, _                 ' H)elp (on line)
  777.                  4100, _                 ' L)ine feeds (on or off)
  778.                  10925, _                ' M)essage margin
  779.                  42710, _                ' N)ulls (on or off)
  780.                  5110, _                 ' P)assword change
  781.                  1200, _                 ' Q)uit and exit to messages subsystem
  782.                  5400, _                 ' R)eview preferences
  783.                  4850, _                 ' S)tatistics displayed
  784.                  9100, _                 ' T)ime
  785.                  10090, _                ' U)serlog displayed
  786.                  4240, _                 ' X)Expert mode toggle on/off
  787.                  4200                    ' !)Prompt sound toggle on/off
  788.      GOTO 1330
  789. 1350 IF EXPERT.USER THEN _
  790.         RETURN
  791.      GOSUB 12979
  792. 1360 A$ = B$(J) + " is invalid, " + FIRST.NAME$
  793.      GOSUB 12979
  794.      RETURN
  795. '
  796. ' *****************************************************************************
  797. ' *  RECORD SECURITY VIOLATIONS                                               *
  798. ' *****************************************************************************
  799. '
  800. 1380 A$ = "SYSOP must authorize"
  801.      GOSUB 1397
  802.      Z$ = "SV!-" + VIOLATION$
  803.      SUBROUTINE.PARAMETER = 2
  804.      CALL UPDTCALR
  805.      VIOLATIONS.THIS.SESSION = VIOLATIONS.THIS.SESSION + 1
  806.      IF MAXIMUM.VIOLATIONS = 0 OR VIOLATIONS.THIS.SESSION <= MAXIMUM.VIOLATIONS THEN _
  807.         RETURN
  808. 1385 IF USER.FILE.INDEX < 1 THEN _
  809.         RETURN
  810.      A$ = "SECURITY VIOLATION!  Sysop can reinstate"
  811.      IF USER.SECURITY.LEVEL <= MINIMUM.LOGON.SECURITY THEN _
  812.         A$ = "" : _
  813.         USER.SECURITY.LEVEL = USER.SECURITY.LEVEL-1 _
  814.      ELSE USER.SECURITY.LEVEL = MINIMUM.LOGON.SECURITY
  815. 1386 GOSUB 12979
  816.      LOGON.ERROR.INDEX = 5
  817.      GOSUB 12989
  818.      GOSUB 9400
  819.      GET 2,USER.FILE.INDEX
  820.      LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL)
  821.      PUT 2,USER.FILE.INDEX
  822.      GOTO 10620
  823. 1397 A$ = "Sorry, " + FIRST.NAME$ + ", " + A$
  824.      GOTO 12979
  825. 1398 CALL CARRIER
  826.      IF SUBROUTINE.PARAMETER = -1 THEN _
  827.         RETURN
  828.      A$ = FIRST.NAME$ + ", your presence here is unacceptable."
  829.      GOSUB 12975
  830.      IF USER.FILE.INDEX < 1 THEN _
  831.         GOTO 10698
  832.      USER.SECURITY.LEVEL = MINIMUM.LOGON.SECURITY - 1
  833.      GOTO 1386
  834. '
  835. ' *****************************************************************************
  836. ' *  ? - COMMAND FROM MAIN MENU (FUNCTIONS SUPPORTED)                         *
  837. ' *****************************************************************************
  838. '
  839. 1700 FILE.NAME$ = HELP$(2)
  840.      GOTO 1765
  841. '
  842. ' *****************************************************************************
  843. ' *  H - COMMAND FROM MAIN MENU (HELP)                                        *
  844. ' *****************************************************************************
  845. '
  846. 1740 FILE.NAME$ = HELP$(1)
  847.      GOTO 1765
  848. '
  849. ' *****************************************************************************
  850. ' *  I - COMMAND FROM MAIN MENU (DISPLAY INITIAL WELCOME)                     *
  851. ' *****************************************************************************
  852. '
  853. 1760 FILE.NAME$ = WELCOME.FILE$
  854. 1765 GOSUB 1790
  855.      RETURN
  856. '
  857. ' *****************************************************************************
  858. ' *  H - COMMAND FROM UTILITIES MENU (HELP)                                   *
  859. ' *****************************************************************************
  860. '
  861. 1780 FILE.NAME$ = HELP$(8)
  862. 1790 GOSUB 43030
  863.      GOSUB 6000
  864.      RETURN
  865. '
  866. ' *****************************************************************************
  867. ' *  C - COMMAND FROM MAIN MENU (LEAVE COMMENT FOR SYSOP)                     *
  868. ' *****************************************************************************
  869. '
  870. 1800 A$ = "Do you wish to leave a comment for " + _
  871.           SYSOP.FIRST.NAME$ + _
  872.           " (Y/N)"
  873.      CALL SKIPLINE
  874.      GOSUB 12995
  875.      RIGHT.MARGIN = 72
  876.      IF NOT YES THEN _
  877.         GOSUB 12979 : _
  878.         RETURN
  879. 1840 IF CONFERENCE.MODE THEN _
  880.         IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  881.            GOSUB 5360 _
  882.         ELSE GOSUB 5350
  883.      MESSAGE.TO$ = "SYSOP"
  884.      SUBJECT$ = "COMMENT"
  885.      IF (ACTIVE.MESSAGES > = MAXIMUM.MESSAGES OR _
  886.          NEXT.MESSAGE.RECORD + 5 > HIGHEST.MESSAGE.RECORD OR _
  887.          NOT COMMENTS.AS.MESSAGES ) THEN _
  888.         A$ = SYSOP.FIRST.NAME$ + " will NOT be able to reply." : _
  889.         GOSUB 12979 : _
  890.         A$ = "Do you still wish to leave a comment? (Y/N)" : _
  891.         CALL SKIPLINE : _
  892.         GOSUB 12995 : _
  893.         IF NOT YES THEN _
  894.            GOSUB 12979 : _
  895.            RETURN : _
  896.         ELSE SYSOP.COMMENT = TRUE : _
  897.              GOTO 2007
  898.      SYSOP.COMMENT = FALSE
  899.      SYSOP.MESSAGE = TRUE
  900.      GOTO 2010
  901. 1850 CLOSE 2
  902.      BX = &H3
  903.      EN$ = COMMENTS.FILE$
  904.      GOSUB 12992
  905.      IF SHARE.IT THEN _
  906.         OPEN COMMENTS.FILE$ FOR APPEND SHARED AS #2 _
  907.         ELSE OPEN "A",2,COMMENTS.FILE$
  908.      A$ = FIRST.NAME$ + ", Thanks for comments!"
  909.      GOSUB 12976
  910.      SUBROUTINE.PARAMETER = 2
  911.      CALL AMORPM
  912.      PRINT #2,ACTIVE.USER.NAME$,CURRENT.DATE$,TIM$
  913.      FOR X = 1 TO LINES.IN.MESSAGE
  914.        PRINT #2,A$(X)
  915.      NEXT
  916.      PRINT #2,CARRIAGE.RETURN$
  917.      CLOSE 2
  918.      BX = &H3
  919.      EN$ = COMMENTS.FILE$
  920.      GOSUB 12993
  921.      Z$ = "Left comment"
  922.      SUBROUTINE.PARAMETER = 1
  923.      CALL UPDTCALR
  924.      RETURN
  925. '
  926. ' *****************************************************************************
  927. ' *  P - COMMAND FROM MAIN MENU (DISPLAY PERSONAL MAIL)                       *
  928. ' *****************************************************************************
  929. '
  930. 1900 GOSUB 30500
  931.      A$ = "Checking messages"
  932.      GOSUB 12978
  933.      SHOW.ACTIVE = TRUE
  934.      MESSAGES.FROM.USER = FALSE
  935.      ACTIVE.MESSAGES = 0
  936.      GOSUB 23000
  937.      MESSAGE.RECORD = FIRST.MESSAGE.RECORD
  938.      ACTIVE.DELAY! = 0
  939.      MAXIMUM.MESSAGES = VAL(MID$(MESSAGE.RECORD$,89,7))
  940.      FOR DF = 1 TO MAXIMUM.MESSAGES
  941.        M(DF,1) = 0
  942.        M(DF,2) = 0
  943.      NEXT
  944. 1905 GET 1,MESSAGE.RECORD
  945.      NUMBER.RECORDS.IN.MESSAGE = VAL(MID$(MESSAGE.RECORD$,118))
  946.      IF NUMBER.RECORDS.IN.MESSAGE < 1 THEN _
  947.         NUMBER.RECORDS.IN.MESSAGE = 1
  948. 1906 CALL FINDTIME (TI!)
  949.      IF SHOW.ACTIVE AND TI! > ACTIVE.DELAY! THEN _
  950.         A$ = "." : _
  951.         GOSUB 12978 : _
  952.         CALL FINDTIME (TI!) : _
  953.         ACTIVE.DELAY! = TI! + 1
  954. 1910 IF MESSAGE.RECORD >= NEXT.MESSAGE.RECORD THEN _
  955.         LOW.MESSAGE.NUMBER = M(1,2) : _
  956.         GOTO 1950
  957. 1915 IF MID$(MESSAGE.RECORD$,116,1) = DELETED.MESSAGE$ OR _
  958.         MID$(MESSAGE.RECORD$,116,1) <> ACTIVE.MESSAGE$ THEN _
  959.         GOTO 1946
  960. 1920 IF INSTR(MID$(MESSAGE.RECORD$,37,31),ACTIVE.USER.NAME$) OR _
  961.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,37,31),"SYSOP")) OR _
  962.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,37,31),SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$)) THEN _
  963.         GOTO 1925
  964.      GOTO 1935
  965. 1925 IF SHOW.ACTIVE THEN _
  966.         A$ = "Mail may be for YOU (* = Private)" : _
  967.         GOSUB 12976 : _
  968.         SHOW.ACTIVE = FALSE
  969. 1930 A$ = LEFT$(MESSAGE.RECORD$,5)
  970.      GOSUB 12978
  971. 1935 IF INSTR(MID$(MESSAGE.RECORD$,6,31),ACTIVE.USER.NAME$) OR _
  972.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,6,31),"SYSOP")) OR _
  973.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,6,31),SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$)) THEN _
  974.         GOTO 1940
  975.      GOTO 1945
  976. 1940 IF MESSAGES.FROM.USER < 128 THEN _
  977.         MESSAGES.FROM.USER = MESSAGES.FROM.USER + 1 : _
  978.         B$(MESSAGES.FROM.USER) = LEFT$(MESSAGE.RECORD$,5)
  979. 1945 ACTIVE.MESSAGES = ACTIVE.MESSAGES + 1
  980.      M(ACTIVE.MESSAGES,1) = MESSAGE.RECORD
  981.      M(ACTIVE.MESSAGES,2) = VAL(MID$(MESSAGE.RECORD$,2,4))
  982. 1946 MESSAGE.RECORD = MESSAGE.RECORD + NUMBER.RECORDS.IN.MESSAGE
  983.      GOTO 1905
  984. 1950 IF MESSAGES.FROM.USER = 0 OR NOT MESSAGE.REMINDER THEN _
  985.         RETURN
  986.      A$ = "Mail you may have left"
  987.      GOSUB 12976
  988. 1960 FOR I = 1 TO MESSAGES.FROM.USER
  989.        A$ = B$(I)
  990.        GOSUB 12978
  991.      NEXT
  992.      A$ = "Please <K>ill your old or unneeded messages"
  993.      GOSUB 12975
  994.      RETURN
  995. '
  996. ' *****************************************************************************
  997. ' *  E - COMMAND FROM MAIN MENU (ENTER MESSAGE)                               *
  998. ' *****************************************************************************
  999. '
  1000. 2000 IF ACTIVE.MESSAGES = MAXIMUM.MESSAGES THEN _
  1001.         A$ = "Too many active messages!  Leave a comment for Sysop! Try tomorrow" : _
  1002.         GOSUB 12975 : _
  1003.         GOTO 3650
  1004. 2006 MESSAGE.PASSWORD$ = ""
  1005.      SYSOP.COMMENT = FALSE
  1006.      IF NOT REPLY THEN _
  1007.         MESSAGE.TO$ = ""
  1008. 2007 IF SYSOP.COMMENT THEN _
  1009.         Z$ = COMMENTS.FILE$ : _
  1010.         FT$ = "comment" _
  1011.      ELSE Z$ = ACTIVE.MESSAGE.FILE$ : _
  1012.           FT$ = "message"
  1013. 2008 IF SYSOP.COMMENT THEN _
  1014.         CALL FINDFREE : _
  1015.         GOTO 2009
  1016.      FREE.SPACE$ = "2000"
  1017.      IF NEXT.MESSAGE.RECORD + 5 >= HIGHEST.MESSAGE.RECORD THEN _
  1018.         FREE.SPACE$ = "1"
  1019. 2009 IF VAL(FREE.SPACE$) < 2000 THEN _
  1020.         A$ = "No room for " + FT$ : _
  1021.         GOSUB 12979 : _
  1022.         GOTO 3650
  1023. 2010 LINES.IN.MESSAGE = 0
  1024.      L = 0
  1025.      X = 0
  1026.      FOR I = 1 TO 30
  1027.        A$(I) = ""
  1028.      NEXT
  1029.      IF SYSOP.COMMENT THEN _
  1030.         GOTO 2100
  1031.      IF SYSOP.MESSAGE THEN _
  1032.         SYSOP.MESSAGE = FALSE : _
  1033.         GOTO 2077
  1034. 2020 IF REPLY THEN _
  1035.         GOTO 2060
  1036.      A$ = "To (Press [ENTER] for All)"
  1037.      CALL SKIPLINE
  1038.      GOSUB 12995
  1039.      IF LEN(B$(1)) > 30 THEN _
  1040.         A$ = "30 Char. Max" : _
  1041.         GOSUB 12979 : _
  1042.         GOTO 2020
  1043. 2030 IF Q = 0 THEN _
  1044.         MESSAGE.TO$ = "ALL" _
  1045.         ELSE CALL ALLCAPS (B$(1)) : _
  1046.         MESSAGE.TO$ = B$(1)
  1047. 2035 A$ = "Subject"
  1048.      GOSUB 12995
  1049.      IF LEN(B$(1)) > 25 THEN _
  1050.         A$ = "25 Char. Max" : _
  1051.         GOSUB 12979 : _
  1052.         GOTO 2035
  1053. 2045 IF Q = 0 THEN _
  1054.         GOTO 20095
  1055.      CALL ALLCAPS (B$(1))
  1056.      SUBJECT$ = B$(1)
  1057. 2060 A$ = "Security: K)ill, P)assword, R)eceiver, N)one, H)elp, [ENTER]=Kill"
  1058.      GOSUB 12995
  1059.      IF Q = 0 THEN _
  1060.         B$(1) = "K"
  1061.      Z$ = LEFT$(B$(1),1)
  1062.      CALL ALLCAPS (Z$)
  1063.      ON INSTR("RKNPH",Z$) GOTO 2075,2090,2100,2088,2070
  1064.      GOTO 2060
  1065. '
  1066. ' *****************************************************************************
  1067. ' *  DISPLAY MESSAGE PROTECT HELP                                             *
  1068. ' *****************************************************************************
  1069. '
  1070. 2070 FILE.NAME$ = HELP$(3)
  1071.      GOSUB 1790
  1072.      GOTO 2060
  1073. '
  1074. ' *****************************************************************************
  1075. ' *  MAKE MESSAGE READ PROTECTED (ONLY ADDRESSEE AND SYSOP CAN READ IT)       *
  1076. ' *****************************************************************************
  1077. '
  1078. 2075 IF MESSAGE.TO$ = "ALL" THEN _
  1079.         A$ = "Message to ALL cannot be Receiver protected!" : _
  1080.         GOSUB 12979 : _
  1081.         GOTO 2060
  1082. 2077 IF INSTR(MESSAGE.TO$,"SYSOP") OR _
  1083.         INSTR(MESSAGE.TO$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$) THEN _
  1084.         GOTO 2081
  1085. 2079 IF NOT REPLY THEN _
  1086.         TEMP.USER.NAME$ = MESSAGE.TO$ : _
  1087.         FOUND = FALSE : _
  1088.         SUIX = USER.FILE.INDEX : _
  1089.         GOSUB 12600 : _
  1090.         USER.FILE.INDEX = SUIX : _
  1091.         GOSUB 12984 : _
  1092.         IF NOT FOUND THEN _
  1093.            A$ = MESSAGE.TO$ + " is not an active user." : _
  1094.            GOSUB 1397 : _
  1095.            GOTO 2020
  1096. 2081 A$ = "Sending personal mail to " + MESSAGE.TO$
  1097.      GOSUB 12979
  1098. 2084 MESSAGE.PASSWORD$ = "^READ^"
  1099.      GOTO 2100
  1100. 2085 A$ = "Password":'
  1101.      GOSUB 12995
  1102.      IF Q = 0 THEN _
  1103.         GOTO 2085
  1104.      IF LEN(B$(1)) > L THEN _
  1105.         A$ = STR$(L) + " Chars. max" : _
  1106.         GOSUB 12979 : _
  1107.         GOTO 2085
  1108.      IF L = 15 AND MID$(B$(1),1,1) = "!" THEN _
  1109.         A$ = "Password can't begin with '!'" : _
  1110.         GOSUB 12979 : _
  1111.         GOTO 2085
  1112.      RETURN
  1113. '
  1114. ' *****************************************************************************
  1115. ' *  MAKE MESSAGE PASSWORD PROTECTED (USERS WITH PASSWORD AND SYSOP CAN READ) *
  1116. ' *****************************************************************************
  1117. '
  1118. 2088 A$ = "Receiver(s) Must KNOW PASSWORD TO READ msg.  Use password (Y/N)"
  1119.      GOSUB 12995
  1120.      IF NO THEN _
  1121.         GOTO 2070
  1122.      L = 14
  1123.      A1$ = "!"
  1124.      GOSUB 2085
  1125.      CALL ALLCAPS(B$(1))
  1126.      GOTO 2092
  1127. '
  1128. ' *****************************************************************************
  1129. ' *  MAKE MESSAGE KILL PROTECTED (ONLY SENDER, ADDRESSEE AND SYSOP CAN KILL)  *
  1130. ' *****************************************************************************
  1131. '
  1132. 2090 L = 15
  1133.      A1$ = ""
  1134.      B$(1) = "^KILL^"
  1135. 2092 MESSAGE.PASSWORD$ = A1$ + B$(1)
  1136. '
  1137. ' *****************************************************************************
  1138. ' *  ENTER MAIN BODY OF MESSAGE                                               *
  1139. ' *****************************************************************************
  1140. '
  1141. 2100 A$ = "Type " + _
  1142.           FT$ + _
  1143.           " Press [ENTER] to end," + _
  1144.           STR$(MAX.MESSAGE.LINES) + _
  1145.           " lines max)"
  1146.      GOSUB 12975
  1147.      GOSUB 3200
  1148. 2125 LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  1149.      A$ = RIGHT$(STR$(LINES.IN.MESSAGE),2) + ": " + A$(LINES.IN.MESSAGE)
  1150.      GOSUB 12978
  1151.      GOSUB 3700
  1152.      IF A$(LINES.IN.MESSAGE) = "" THEN _
  1153.         LINES.IN.MESSAGE = LINES.IN.MESSAGE-1 : _
  1154.         GOTO 2300
  1155. 2140 J = LINES.IN.MESSAGE
  1156.      GOSUB 2200
  1157.      IF X THEN _
  1158.         GOTO 2300
  1159.      GOTO 2125
  1160. 2200 X = 0
  1161.      IF J < (MAX.MESSAGE.LINES-2) THEN _
  1162.         RETURN
  1163.      A$ = MID$("2 lines leftLast line   Full",12*(J-(MAX.MESSAGE.LINES-2)) + 1,12)
  1164.      X = (J > (MAX.MESSAGE.LINES-1))
  1165. 2210 GOSUB 12979
  1166.      RETURN
  1167. '
  1168. ' *****************************************************************************
  1169. ' *  FINAL MESSAGE DISPOSITION                                                *
  1170. ' *****************************************************************************
  1171. '
  1172. 2300 GOSUB 12979
  1173.      IF NOT EXPERT.USER THEN _
  1174.         GOSUB 50400
  1175. 2315 A$ = "Editor Sub-function <A,C,D,E,I,L,M,S,?>"
  1176.      CALL SKIPLINE
  1177.      GOSUB 12995
  1178.      IF Q = 0 THEN _
  1179.         GOTO 2315
  1180.      CALL ALLCAPS (B$(1))
  1181.      Z$ = B$(1)
  1182. 2325 IF Q > 1 AND Z$ <> "M" THEN _
  1183.         L = VAL(B$(Q)) : _
  1184.         GOSUB 3320
  1185. 2330 ON INSTR("ACDEILMS?",Z$) GOTO 2400,2340,2500,2600,2800,3000,3100,3400,2345
  1186.      GOTO 2300
  1187. '
  1188. ' *****************************************************************************
  1189. ' *  CONTINUE ENTERING MESSAGE                                                *
  1190. ' *****************************************************************************
  1191. '
  1192. 2340 GOSUB 3200
  1193.      GOTO 2140
  1194. '
  1195. ' *****************************************************************************
  1196. ' *  DISPLAY MESSAGE SUBCOMMANDS HELP FILE                                    *
  1197. ' *****************************************************************************
  1198. '
  1199. 2345 FILE.NAME$ = HELP$(4)
  1200.      GOSUB 1790
  1201.      GOTO 2315
  1202. '
  1203. ' *****************************************************************************
  1204. ' *  ABORT MESSAGE                                                            *
  1205. ' *****************************************************************************
  1206. '
  1207. 2400 A$ = "Abort " + FT$ + " (Y/N)"
  1208.      CALL SKIPLINE
  1209.      GOSUB 12995
  1210.      IF NOT YES THEN _
  1211.         GOTO 2300
  1212. 2430 A$ = "Aborted"
  1213.      GOSUB 12975
  1214.      GOTO 3650
  1215. '
  1216. ' *****************************************************************************
  1217. ' *  DELETE MESSAGE LINE                                                      *
  1218. ' *****************************************************************************
  1219. '
  1220. 2500 GOSUB 12979
  1221.      IF Q = 1 THEN _
  1222.         A$ = "Delete " : _
  1223.         GOSUB 12978 : _
  1224.         GOSUB 3300
  1225. 2520 A$ = "Line #" + STR$(L)
  1226.      GOSUB 12979
  1227.      A$ = A$(L)
  1228.      GOSUB 12977
  1229.      A$ = "Delete this line (Y/N)"
  1230.      GOSUB 12995
  1231.      IF NOT YES THEN _
  1232.         A$ = "NOT Deleted" : _
  1233.         GOSUB 12979 : _
  1234.         GOTO 2300
  1235. 2550 LINES.IN.MESSAGE = LINES.IN.MESSAGE-1
  1236.      FOR X = L TO LINES.IN.MESSAGE
  1237.        A$(X) = A$(X + 1)
  1238.      NEXT
  1239.      A$(LINES.IN.MESSAGE + 1) = ""
  1240.      A$ = "Deleted Line #" + STR$(L)
  1241.      GOSUB 12979
  1242.      GOTO 2300
  1243. '
  1244. ' *****************************************************************************
  1245. ' *  EDIT MESSAGE LINE                                                        *
  1246. ' *****************************************************************************
  1247. '
  1248. 2600 GOSUB 12979
  1249.      IF Q = 1 THEN _
  1250.         GOSUB 3300
  1251. 2620 A$ = "Line #" + STR$(L) + " is:" + RETURN.LINE.FEED$ + A$(L)
  1252.      GOSUB 12977
  1253.      A$ = "Enter <Oldstring;New> or Press [ENTER] to end"
  1254.      GOSUB 12979
  1255.      B$(2) = ""
  1256.      GOSUB 12995
  1257.      IF Q = 0 THEN _
  1258.         GOTO 2300
  1259. 2660 X = INSTR(1,A$(L),B$(1))
  1260.      IF X = 0 THEN _
  1261.         GOTO 2710
  1262. 2670 FF = LEN(B$(1))
  1263.      JJ = LEN(B$(2))
  1264.      IF FF = JJ THEN _
  1265.         MID$(A$(L),X) = B$(2) : _
  1266.         GOTO 2620
  1267. 2690 CC$ = MID$(A$(L),X + FF)
  1268.      DF$ = LEFT$(A$(L),X-1)
  1269.      A$(L) = DF$ + B$(2) + CC$
  1270.      GOTO 2620
  1271. 2710 A$ = "String <" + B$(1) + "> not found in line" + STR$(L)
  1272.      GOSUB 12979
  1273.      GOTO 2300
  1274. '
  1275. ' *****************************************************************************
  1276. ' *  INSERT MESSAGE LINE                                                      *
  1277. ' *****************************************************************************
  1278. '
  1279. 2800 IF LINES.IN.MESSAGE >= MAX.MESSAGE.LINES AND NOT SYSOP THEN _
  1280.         A$ = "Message full" : _
  1281.         GOSUB 12979 : _
  1282.         GOTO 2920
  1283. 2820 GOSUB 12979
  1284.      IF Q = 1 THEN _
  1285.         A$ = "Before " : _
  1286.         GOSUB 12978 : _
  1287.         GOSUB 3300
  1288. 2830 LL = LINES.IN.MESSAGE
  1289.      K = LINES.IN.MESSAGE-L
  1290.      FOR X = L TO LINES.IN.MESSAGE
  1291.        B$(X + 1-L) = A$(X)
  1292.        A$(X) = ""
  1293.      NEXT
  1294.      LINES.IN.MESSAGE = L
  1295. 2840 A$ = RIGHT$(STR$(LINES.IN.MESSAGE),2) + ": "
  1296.      GOSUB 12978
  1297.      GOSUB 3700
  1298.      IF A$(LINES.IN.MESSAGE) = "" THEN _
  1299.         GOTO 2920
  1300. 2870 LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  1301.      J = LINES.IN.MESSAGE + K-1
  1302.      GOSUB 2200
  1303.      IF X THEN _
  1304.         GOTO 2920 _
  1305.      ELSE GOTO 2840
  1306. 2920 FOR X = 1 TO K + 1
  1307.        A$(LINES.IN.MESSAGE + X-1) = B$(X)
  1308.      NEXT
  1309.      LINES.IN.MESSAGE = LL + LINES.IN.MESSAGE-L
  1310.      GOTO 2300
  1311. '
  1312. ' *****************************************************************************
  1313. ' *  LIST MESSAGE CONTENTS                                                    *
  1314. ' *****************************************************************************
  1315. '
  1316. 3000 STOP.INTERRUPTS = TRUE
  1317.      GOSUB 12979
  1318.      IF Q = 1 THEN _
  1319.         L = 1 : _
  1320.         A$ = "To: " + MESSAGE.TO$ + " Re: " + SUBJECT$ : _
  1321.         GOSUB 12979 : _
  1322.         GOSUB 3200
  1323. 3020 FOR X = L TO LINES.IN.MESSAGE
  1324.        IF RET THEN _
  1325.           GOTO 2300 _
  1326.        ELSE A$ = RIGHT$(STR$(X),2) + ": " + A$(X)
  1327. 3030   GOSUB 12979
  1328.      NEXT
  1329.      GOTO 2300
  1330. '
  1331. ' *****************************************************************************
  1332. ' *  CHANGE MARGIN WIDTH                                                      *
  1333. ' *****************************************************************************
  1334. '
  1335. 3100 GOSUB 12979
  1336.      IF Q <> 1 THEN _
  1337.         B$(1) = B$(Q) : _
  1338.         GOTO 3130
  1339. 3115 A$ = "SET Right-Margin from" + STR$(RIGHT.MARGIN) + " TO (8...72)"
  1340.      GOSUB 12995
  1341.      IF LEN(B$(1)) > 2 THEN _
  1342.         GOTO 3140
  1343. 3130 X = VAL(B$(1))
  1344.      IF X > 7 AND X < 73 THEN _
  1345.         RIGHT.MARGIN = X : _
  1346.         A$ = "Margin now" + STR$(RIGHT.MARGIN) : _
  1347.         GOTO 3150
  1348. 3140 A$ = "Invalid - Margin UNCHANGED"
  1349. 3150 GOSUB 12979
  1350.      IF UTILITY.MARGIN.CHANGE THEN _
  1351.         RETURN
  1352.      GOTO 2300
  1353. 3200 A$ = "    [" + STRING$(RIGHT.MARGIN-2,45) + "]"
  1354.      GOSUB 12975
  1355.      RETURN
  1356. 3300 A$ = "Line #"
  1357.      GOSUB 12995
  1358.      L = VAL(B$(1))
  1359. 3320 IF L >= 1 AND L <= LINES.IN.MESSAGE THEN _
  1360.         RETURN
  1361. 3330 IF Q = 0 THEN _
  1362.         RETURN 2300
  1363. 3340 A$ = "No such line"
  1364.      GOSUB 12979
  1365.      RETURN 2300
  1366. '
  1367. ' *****************************************************************************
  1368. ' *  SAVE MESSAGE                                                             *
  1369. ' *****************************************************************************
  1370. '
  1371. 3400 IF SYSOP.COMMENT THEN _
  1372.         GOTO 1850
  1373. 3405 GOSUB 4910
  1374.      MESSAGE.RECORD.SAVE$ = MESSAGE.RECORD$
  1375.      A$ = "Adding new msg #" + STR$(HIGH.MESSAGE.NUMBER + 1)
  1376.      GOSUB 12978
  1377.      REC = 0
  1378.      N$ = ""
  1379.      HIGH.MESSAGE.NUMBER = HIGH.MESSAGE.NUMBER + 1
  1380.      ACTIVE.MESSAGES = ACTIVE.MESSAGES + 1
  1381.      MESSAGE.NUMBER$ = STR$(HIGH.MESSAGE.NUMBER) + _
  1382.                        SPACE$(5-LEN(STR$(HIGH.MESSAGE.NUMBER)))
  1383.      IF MESSAGE.PASSWORD$ = "^READ^" THEN _
  1384.         MID$(MESSAGE.NUMBER$,1,1) = "*"
  1385. 3460 MESSAGE.FROM$ = ACTIVE.USER.NAME$ + SPACE$(31-LEN(ACTIVE.USER.NAME$))
  1386.      MESSAGE.TO$ = MESSAGE.TO$ + SPACE$(31-LEN(MESSAGE.TO$))
  1387.      MID$(MESSAGE.TO$,23,8) = TIME$
  1388.      SUBJECT$ = SUBJECT$ + SPACE$(25-LEN(SUBJECT$))
  1389.      MESSAGE.PASSWORD$ = MESSAGE.PASSWORD$ + SPACE$(15-LEN(MESSAGE.PASSWORD$))
  1390.      FOR J = 1 TO LINES.IN.MESSAGE
  1391.        A$(J) = A$(J) + CHR$(227)
  1392.        REC = REC + LEN(A$(J))
  1393.      NEXT
  1394.      IF REC MOD 128 = 0 THEN _
  1395.         N$ = STR$(REC\128 + 1) _
  1396.      ELSE N$ = STR$(REC\128 + 2)
  1397. 3530 GET 1,NEXT.MESSAGE.RECORD
  1398.      M(ACTIVE.MESSAGES,1) = NEXT.MESSAGE.RECORD
  1399.      M(ACTIVE.MESSAGES,2) = HIGH.MESSAGE.NUMBER
  1400.      LSET MESSAGE.RECORD$ = MESSAGE.NUMBER$ + _
  1401.                             MESSAGE.FROM$ + _
  1402.                             MESSAGE.TO$ + _
  1403.                             CURRENT.DATE$ + _
  1404.                             SUBJECT$ + _
  1405.                             MESSAGE.PASSWORD$ + _
  1406.                             ACTIVE.MESSAGE$ + _
  1407.                             N$
  1408.      PUT 1,NEXT.MESSAGE.RECORD
  1409.      NEXT.MESSAGE.RECORD = NEXT.MESSAGE.RECORD + VAL(N$)
  1410.      N$ = ""
  1411.      FOR J = 1 TO LINES.IN.MESSAGE
  1412.        A$ = "."
  1413.        GOSUB 12978
  1414.        N$ = N$ + A$(J)
  1415.        IF LEN(N$) > 127 THEN _
  1416.           LSET MESSAGE.RECORD$ = N$ : _
  1417.           PUT 1 : _
  1418.           N$ = MID$(N$,129)
  1419. 3630 NEXT
  1420.      IF LEN(N$) > 0 THEN _
  1421.         LSET MESSAGE.RECORD$ = N$ : _
  1422.         PUT 1
  1423. 3640 GOSUB 12979
  1424.      LSET MESSAGE.RECORD$ = MESSAGE.RECORD.SAVE$
  1425.      GOSUB 24000
  1426.      GOSUB 12985
  1427. 3650 IF REPLY THEN _
  1428.         GOSUB 30500 : _
  1429.         RETURN
  1430.      GOTO 20095
  1431. '
  1432. ' *****************************************************************************
  1433. ' *  ENTER MESSAGE/COMMENT LINES                                              *
  1434. ' *****************************************************************************
  1435. '
  1436. 3700 RS$ = A$(LINES.IN.MESSAGE)
  1437.      COL = LEN(RS$)
  1438.      STOP.INTERRUPTS = FALSE
  1439. 3720 COL = COL + 1
  1440. 3730 IF LOCAL.USER THEN _
  1441.         X$ = INPUT$(1) : _
  1442.         GOTO 3740
  1443. 3732 CALL FINDTIME (TI!)
  1444.      AUTO.LOGOFF! = TI! + WAIT.BEFORE.DISCONNECT
  1445.      WHILE EOF(3)
  1446.        CALL FINDTIME (TI!)
  1447.        IF TI! > AUTO.LOGOFF! THEN _
  1448.           GOTO 10590
  1449. 3733   CALL CARRIER
  1450.        IF SUBROUTINE.PARAMETER = -1 THEN _
  1451.           GOTO 10595
  1452.        GOSUB 60000
  1453.        X$ = KEY.PRESSED$
  1454.        IF LEN(X$) = 1 THEN _
  1455.           AUTO.LOGOFF! = TI! + WAIT.BEFORE.DISCONNECT : _
  1456.           GOTO 3740
  1457. 3736 WEND
  1458.      AUTO.LOGOFF! = TI! + WAIT.BEFORE.DISCONNECT
  1459. 3737 X$ = INPUT$(1,3)
  1460.      IF X$ = LINE.FEED$ OR _
  1461.         X$ = CHR$(11) OR _
  1462.         X$ = CHR$(12) THEN _
  1463.         GOTO 3730
  1464. 3738 IF X$ = CHR$(127) THEN _
  1465.         GOTO 3870
  1466. 3740 IF X$ = CHR$(8) OR _
  1467.         X$ = CHR$(7) OR _
  1468.         X$ = CHR$(26) OR _
  1469.         X$ = CHR$(227) THEN _
  1470.         GOTO 3870
  1471. 3750 A$ = X$
  1472.      GOSUB 12978
  1473.      IF X$ = CARRIAGE.RETURN$ THEN _
  1474.         GOTO 3850
  1475. 3770 IF COL > RIGHT.MARGIN-3 AND X$ = " " THEN _
  1476.         GOSUB 12979 : _
  1477.         GOTO 3860
  1478. 3780 RS$ = RS$ + X$
  1479.      IF COL < RIGHT.MARGIN + 1 THEN _
  1480.         GOTO 3720
  1481. 3800 Z = LEN(RS$)
  1482.      FOR I = 1 TO LEN(RS$)
  1483.        IF MID$(RS$,Z,1) = " " THEN _
  1484.           GOTO 3820
  1485. 3810   Z = Z-1
  1486.      NEXT
  1487.      Z = LEN(RS$)-1
  1488. 3820 COL = RIGHT.MARGIN + 1 - Z
  1489.      IF SNOOP THEN _
  1490.         LOCATE ,POS(0)-COL: _
  1491.         PRINT STRING$(COL,32);
  1492. 3830 IF NOT LOCAL.USER AND INP(MODEM.STATUS.REGISER) > 127 THEN _
  1493.         PRINT #3,STRING$(COL,8) + STRING$(COL,32);
  1494. 3840 A$(LINES.IN.MESSAGE) = LEFT$(RS$,Z)
  1495.      A$(LINES.IN.MESSAGE + 1) = RIGHT$(RS$,COL)
  1496.      GOSUB 12979
  1497.      RETURN
  1498. 3850 IF NOT LOCAL.USER AND LINE.FEEDS AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  1499.         PRINT #3,LINE.FEED$;
  1500. 3860 A$(LINES.IN.MESSAGE) = RS$
  1501.      RETURN
  1502. 3870 IF COL = 1 THEN _
  1503.         GOTO 3730
  1504.      COL = COL-2
  1505.      RS$ = LEFT$(RS$,LEN(RS$)-1)
  1506. 3880 IF SNOOP THEN _
  1507.         PRINT BACK.ARROW$;
  1508. 3885 IF NOT LOCAL.USER AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  1509.         PRINT #3,BACKSPACE$;
  1510. 3890 GOTO 3720
  1511. '
  1512. ' *****************************************************************************
  1513. ' *  K - COMMAND FROM MAIN MENU (KILL MESSAGE)                                *
  1514. ' *****************************************************************************
  1515. '
  1516. 3900 KILL.MESSAGE = FALSE
  1517.      GOSUB 12979
  1518.      IF Q <> 1 THEN _
  1519.         MESSAGE.TO.KILL = VAL(B$(Q)) : _
  1520.         GOTO 3950
  1521. 3930 A$ = "Msg # to Kill"
  1522.      GOSUB 12995
  1523.      MESSAGE.TO.KILL = VAL(B$(Q))
  1524.      GOSUB 12979
  1525. 3950 FOR QX = 1 TO ACTIVE.MESSAGES
  1526.        IF M(QX,2) = MESSAGE.TO.KILL AND MESSAGE.TO.KILL >= 1 THEN _
  1527.           GOTO 3970
  1528. 3955 NEXT
  1529.      GOSUB 3965
  1530.      GOTO 4040
  1531. 3965 A$ = "No such msg #" + STR$(MESSAGE.TO.KILL)
  1532.      GOSUB 12979
  1533.      RETURN
  1534. 3970 GOSUB 12986
  1535.      GOSUB 30500
  1536.      GET 1,M(QX,1)
  1537.      R = VAL(MID$(MESSAGE.RECORD$,118))
  1538.      IF SYSOP THEN _
  1539.         GOTO 4030
  1540. 3980 Z$ = MID$(MESSAGE.RECORD$,101,15)
  1541.      Z$ = LEFT$(Z$ + SPACE$(2),INSTR(Z$ +SPACE$(2),SPACE$(2))-1)
  1542.      IF LEN(Z$) = 0 THEN _
  1543.         GOTO 4030
  1544. 3990 IF Z$ = "^READ^" OR Z$ = "^KILL^" THEN _
  1545.         IF INSTR(MESSAGE.RECORD$,ACTIVE.USER.NAME$) THEN _
  1546.            GOTO 4030 _
  1547.         ELSE MESSAGE.PASSWORD = TRUE : _
  1548.              ATTEMPTS.ALLOWED = 0 : _
  1549.              A$ = "Only sender and receiver can kill": _
  1550.              GOSUB 12979 : _
  1551.              GOSUB 12987 : _
  1552.              GOTO 4040
  1553. 4000 IF LEFT$(Z$,1) = "!" THEN _
  1554.         Z$ = MID$(Z$,2)
  1555. 4010 PASSWORD.SAVE$ = Z$ + SPACE$(15-LEN(Z$))
  1556.      ATTEMPTS.ALLOWED = 1
  1557.      MESSAGE.PASSWORD = TRUE
  1558.      GOSUB 667
  1559.      IF PASSWORD.FAILED THEN _
  1560.         GOSUB 12987 : _
  1561.         GOTO 4040
  1562. 4030 LSET MESSAGE.RECORD$ = LEFT$(MESSAGE.RECORD$,115) + _
  1563.                             DELETED.MESSAGE$ + _
  1564.                             MID$(MESSAGE.RECORD$,117)
  1565.      PUT 1,LOC(1)
  1566.      A$ = "Killed Msg # " + STR$(MESSAGE.TO.KILL)
  1567.      GOSUB 12979
  1568.      GOSUB 12987
  1569. 4040 IF KILL.MESSAGE THEN _
  1570.         RETURN
  1571.      GOTO 20095
  1572. '
  1573. ' *****************************************************************************
  1574. ' *  L - COMMAND FROM UTILITY MENU (LINE FEEDS TOGGLE)                        *
  1575. ' *****************************************************************************
  1576. '
  1577. 4100 LINE.FEEDS = NOT LINE.FEEDS
  1578.      A$ = "Line Feeds " + MID$("OffOn",1-3*LINE.FEEDS,3)
  1579.      CALL SETCRLF
  1580.      IF USER.DATA THEN _
  1581.         PRINT A$ : _
  1582.         RETURN
  1583.      GOSUB 12979
  1584.      RETURN
  1585. '
  1586. ' *****************************************************************************
  1587. ' *  P - COMMAND FROM UTILITY MENU (PROMPT BELL TOGGLE)                       *
  1588. ' *****************************************************************************
  1589. '
  1590. 4200 PROMPT.BELL = NOT PROMPT.BELL
  1591.      A$ = "Prompting Bell " + MID$("OffOn",1-3*PROMPT.BELL,3)
  1592.      IF USER.DATA THEN _
  1593.         PRINT A$ : _
  1594.         RETURN
  1595.      GOSUB 12979
  1596.      RETURN
  1597. '
  1598. ' *****************************************************************************
  1599. ' *  X - COMMAND FROM MAIN MENU (EXPERT TOGGLE)                               *
  1600. ' *  X - COMMAND FROM UTILITY MENU (EXPERT TOGGLE)                            *
  1601. ' *  X - COMMAND FROM FILES MENU (EXPERT TOGGLE)                              *
  1602. ' *****************************************************************************
  1603. '
  1604. 4240 EXPERT.USER = NOT EXPERT.USER
  1605.      A$ = MID$("NoviceExpert",1-6*EXPERT.USER,6)
  1606.      IF USER.DATA THEN _
  1607.         PRINT A$ : _
  1608.         RETURN
  1609.      GOSUB 12979
  1610.      RETURN
  1611. '
  1612. ' *****************************************************************************
  1613. ' *  Q - COMMAND FROM MAIN MENU (QUICK SCAN MESSAGES)                         *
  1614. ' *****************************************************************************
  1615. '
  1616. 4320 QUICK.SCAN.MESSAGES = TRUE
  1617.      READ.MESSAGES = FALSE
  1618.      SCAN.MESSAGES = FALSE
  1619.      GOTO 4350
  1620. '
  1621. ' *****************************************************************************
  1622. ' *  R - COMMAND FROM MAIN MENU (READ MESSAGES)                               *
  1623. ' *****************************************************************************
  1624. '
  1625. 4330 QUICK.SCAN.MESSAGES = FALSE
  1626.      READ.MESSAGES = TRUE
  1627.      SCAN.MESSAGES = FALSE
  1628.      GOTO 4350
  1629. '
  1630. ' *****************************************************************************
  1631. ' *  S - COMMAND FROM MAIN MENU (SCAN MESSAGE HEADERS)                        *
  1632. ' *****************************************************************************
  1633. '
  1634. 4340 QUICK.SCAN.MESSAGES = FALSE
  1635.      READ.MESSAGES = FALSE
  1636.      SCAN.MESSAGES = TRUE
  1637. '
  1638. ' *****************************************************************************
  1639. ' *  MESSAGE READ MAINLINE (QUICK SCAN, READ & SCAN ALL USE THIS ROUTINE      *
  1640. ' *****************************************************************************
  1641. '
  1642. 4350 GOSUB 30500
  1643.      QAH = -READ.MESSAGES-QUICK.SCAN.MESSAGES-SCAN.MESSAGES*5
  1644.      IF Q > 2 AND VAL(B$(Q)) = 0 THEN _
  1645.         Z$ = B$(Q) : _
  1646.         CALL ALLCAPS (Z$) : _
  1647.         Q = Q-1 _
  1648.      ELSE Z$ = ""
  1649. 4360 LG$(11) = Z$
  1650.      MESSAGES.SELECTED.INDEX = 1
  1651.      NUMBER.MESSAGES.SELECTED = Q
  1652.      ADDRESSED.TO.USER = FALSE
  1653. 4370 MESSAGES.SELECTED.INDEX = MESSAGES.SELECTED.INDEX  + 1
  1654. 4371 IF MESSAGES.SELECTED.INDEX <= NUMBER.MESSAGES.SELECTED THEN _
  1655.         CURRENT.MESSAGE = VAL(B$(MESSAGES.SELECTED.INDEX)) : _
  1656.         GOTO 4415
  1657. 4380 NON.STOP = FALSE
  1658.      ADDRESSED.TO.USER = FALSE
  1659.      A$ = "Msg # (" + _
  1660.            STR$(LOW.MESSAGE.NUMBER) + _
  1661.            " to" + _
  1662.            STR$(M(ACTIVE.MESSAGES,2)) + _
  1663.            ", *, <H>elp)"
  1664.      IF EXPERT.USER THEN _
  1665.         GOTO 4400
  1666. 4390 IF READ.MESSAGES THEN _
  1667.         A$ = A$ + " to Retrieve (Press [ENTER] to end)" _
  1668.      ELSE A$ = "Starting at " + A$
  1669. 4400 GOSUB 12995
  1670.      IF Q = 0 THEN _
  1671.         GOTO 20095
  1672.      IF INSTR("Hh",LEFT$(B$(1),1)) THEN _
  1673.         FILE.NAME$ = HELP$(7) : _
  1674.         GOSUB 1790 : _
  1675.         RETURN
  1676.      MESSAGES.SELECTED.INDEX = 0
  1677.      NUMBER.MESSAGES.SELECTED = Q
  1678.      GOTO 4370
  1679. 4415 FORWARD = FALSE
  1680.      REVERSE = FALSE
  1681.      IF B$(MESSAGES.SELECTED.INDEX) = "*" THEN _
  1682.         CURRENT.MESSAGE = LAST.MESSAGE.READ + 1 : _
  1683.         FORWARD = TRUE : _
  1684.         GOTO 4430
  1685. 4416 IF INSTR("Mm",B$(MESSAGES.SELECTED.INDEX)) THEN _
  1686.         ADDRESSED.TO.USER = TRUE : _
  1687.         GOTO 4370
  1688.      IF CURRENT.MESSAGE = 0 THEN _
  1689.         GOTO 20095
  1690.      GOSUB 12979
  1691. 4430 IF RIGHT$(B$(MESSAGES.SELECTED.INDEX),1) = "+" THEN _
  1692.         FORWARD = TRUE
  1693.      IF RIGHT$(B$(MESSAGES.SELECTED.INDEX),1) = "-" THEN _
  1694.         REVERSE = TRUE : _
  1695.         GOTO 4490
  1696. 4450 FOR MESSAGE.DIM.INDEX = 1 TO ACTIVE.MESSAGES
  1697.        IF READ.MESSAGES AND _
  1698.           M(MESSAGE.DIM.INDEX,2) = CURRENT.MESSAGE THEN _
  1699.           GOTO 4520
  1700. 4470   IF ((READ.MESSAGES AND FORWARD) OR QUICK.SCAN.MESSAGES OR SCAN.MESSAGES) AND _
  1701.           M(MESSAGE.DIM.INDEX,2)  >= CURRENT.MESSAGE THEN _
  1702.           GOTO 4520
  1703. 4480 NEXT
  1704.      GOTO 4515
  1705. 4490 FOR MESSAGE.DIM.INDEX = ACTIVE.MESSAGES TO 1 STEP -1
  1706.        IF M(MESSAGE.DIM.INDEX,2) <= CURRENT.MESSAGE THEN _
  1707.           GOTO 4540
  1708. 4510 NEXT
  1709. 4515 MESSAGE.TO.KILL = CURRENT.MESSAGE
  1710.      GOSUB 3965
  1711.      GOTO 4370
  1712. 4520 ENDING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  1713.      IF READ.MESSAGES AND NOT FORWARD THEN _
  1714.         GOTO 4560
  1715. 4530 STARTING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  1716.      ENDING.MESSAGE.INDEX = ACTIVE.MESSAGES
  1717.      SO = 1
  1718.      GOTO 4550
  1719. 4540 STARTING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  1720.      ENDING.MESSAGE.INDEX = 1
  1721.      SO = -1
  1722. 4550 FOR MESSAGE.DIM.INDEX = STARTING.MESSAGE.INDEX TO _
  1723.                              ENDING.MESSAGE.INDEX STEP SO
  1724. 4560   GET 1,M(MESSAGE.DIM.INDEX,1)
  1725.        PASSWORD.FAILED = 0
  1726.        UH = 0
  1727.        Z$ = MID$(MESSAGE.RECORD$,101,15)
  1728.        X = 1
  1729. 4561   FF = INSTR(MID$(MESSAGE.RECORD$,X),ACTIVE.USER.NAME$)
  1730.        IF FF THEN _
  1731.           X = LEN(ACTIVE.USER.NAME$) + FF : _
  1732.           IF (FF < 7 OR MID$(MESSAGE.RECORD$,FF-1,1) = " ") AND (X > 66 OR MID$(MESSAGE.RECORD$,X,1) = " ") THEN _
  1733.              UH = TRUE _
  1734.           ELSE IF FF < 37 THEN _
  1735.                   X = 37 : _
  1736.                   GOTO 4561
  1737. 4562   IF NOT SYSOP THEN _
  1738.           IF INSTR(MESSAGE.RECORD$,"^READ^") > 0 AND NOT UH THEN _
  1739.              PASSWORD.FAILED = TRUE : _
  1740.              IF FORWARD OR REVERSE THEN _
  1741.                 GOTO 4635
  1742. 4563   CURRENT.MESSAGE = VAL(MID$(MESSAGE.RECORD$,2,4))
  1743.        IF ADDRESSED.TO.USER AND NOT UH THEN _
  1744.           GOTO 4625
  1745. 4580   IF INSTR(MESSAGE.RECORD$,LG$(11)) = 0 THEN _
  1746.           GOTO 4635
  1747. 4581   IF MID$(MESSAGE.RECORD$,116,1) = DELETED.MESSAGE$ THEN _
  1748.           GOTO 4630
  1749. 4582   PG = FALSE
  1750.        IF MID$(Z$,1,1) = "!" THEN _
  1751.           IF NOT SYSOP THEN _
  1752.              PG = TRUE : _
  1753.              PASSWORD.SAVE$ = MID$(Z$,2) + " " : _
  1754.              ATTEMPTS.ALLOWED = 0 : _
  1755.              GOSUB 665
  1756. 4584   IF PASSWORD.FAILED AND _
  1757.           (QUICK.SCAN.MESSAGES OR (SCAN.MESSAGES AND NOT PG)) THEN _
  1758.           GOTO 4635
  1759. 4585   IF PASSWORD.FAILED THEN _
  1760.           IF PG THEN _
  1761.              SJ$ = "<PASSWORD>" _
  1762.           ELSE SJ$ = "<PROTECTED>" _
  1763.        ELSE SJ$ = MID$(MESSAGE.RECORD$,76,25)
  1764. 4590   IF QUICK.SCAN.MESSAGES THEN _
  1765.           A$ = LEFT$(MESSAGE.RECORD$,5) : _
  1766.           A$ = LEFT$(A$ + SPACE$(2),INSTR(A$ +SPACE$(2),SPACE$(2))-1) : _
  1767.           A$ = A$ + " " + SJ$ : _
  1768.           GOSUB 12979 : _
  1769.           GOTO 4630
  1770. 4600   GOSUB 8000
  1771.        IF SCAN.MESSAGES OR RET THEN _
  1772.           GOTO 4630
  1773.        IF M(MESSAGE.DIM.INDEX,2) > LAST.MESSAGE.READ THEN _
  1774.           LAST.MESSAGE.READ = M(MESSAGE.DIM.INDEX,2)
  1775. 4610   IF NOT PASSWORD.FAILED THEN _
  1776.           GOTO 4613
  1777.        IF PG THEN _
  1778.           ATTEMPTS.ALLOWED = 2 : _
  1779.           GOSUB 667
  1780. 4611   IF PASSWORD.FAILED THEN _
  1781.           GOTO 4625
  1782. 4613   GOSUB 9000
  1783.        GOSUB 12979
  1784.        IF Q = 0 OR PAGE.LENGTH = 0 THEN _
  1785.           GOTO 4625
  1786. 4614   GOSUB 41000
  1787.        KILL.MESSAGE = FALSE
  1788.        REPLY = FALSE
  1789.        IF NON.STOP THEN _
  1790.           GOTO 4625
  1791. 4616   A$ = "More (Y),N,NS,RE" + MID$(",K",1,-UH*2)
  1792.        IF NOT EXPERT.USER THEN _
  1793.           A$ = "More [Y]es,[N]o,[NS]non-stop,[RE]ply" + _
  1794.                 MID$(",[K]ill",1,-UH*7)
  1795.        GOSUB 12995
  1796.        IF NO THEN _
  1797.           GOTO 4650
  1798. '
  1799. ' *****************************************************************************
  1800. ' *  KILL CURRENT MESSAGE                                                     *
  1801. ' *****************************************************************************
  1802. '
  1803. 4618   IF KILL.MESSAGE AND (UH OR SYSOP) THEN _
  1804.           IF USER.SECURITY.LEVEL >= MAIN.FUNCTION(10) THEN _
  1805.              GOSUB 62520 : _
  1806.              MESSAGE.TO.KILL = CURRENT.MESSAGE : _
  1807.              GOSUB 3950 : _
  1808.              GOSUB 62530 : _
  1809.              GOTO 4625 _
  1810.           ELSE VIOLATION$ = "MMenu R) Func 10" : _
  1811.                GOSUB 1380 : _
  1812.                GOTO 4625
  1813. '
  1814. ' *****************************************************************************
  1815. ' *  REPLY TO CURRENT MESSAGE                                                 *
  1816. ' *****************************************************************************
  1817. '
  1818. 4620   IF NOT REPLY THEN _
  1819.           GOTO 4625
  1820. 4621   IF USER.SECURITY.LEVEL < MAIN.FUNCTION(4) THEN _
  1821.           VIOLATION$ = "MMenu R) Func 4" : _
  1822.           GOSUB 1380 : _
  1823.           REPLY = FALSE : _
  1824.           GOTO 4625
  1825.        IF LEFT$(SUBJECT$,3) <> "(R)" THEN _
  1826.           SUBJECT$ = "(R)" + LEFT$(SUBJECT$,22)
  1827. 4622   MESSAGE.TO$ = MESSAGE.FROM$
  1828.        MESSAGE.FROM$ = ACTIVE.USER.NAME$
  1829.        GOSUB 62520
  1830.        GOSUB 2000
  1831.        REPLY = FALSE
  1832.        GOSUB 62530
  1833.        GOTO 4560
  1834. 4625   IF NOT FORWARD AND NOT REVERSE THEN _
  1835.           GOTO 4370
  1836. 4630   IF PAGE.LENGTH = 0 THEN _
  1837.           GOTO 4631
  1838.        Q = Q + QAH
  1839.        IF Q < PAGE.LENGTH THEN _
  1840.             GOTO 4631
  1841.        GOSUB 5600
  1842.        IF NO THEN _
  1843.           Q = 0 : _
  1844.           GOTO 4650
  1845.        Q = QAH
  1846. 4631   CALL CARRIER
  1847.        IF SUBROUTINE.PARAMETER = -1 THEN _
  1848.           GOTO 10595
  1849.        IF RET THEN _
  1850.           GOTO 20095
  1851. 4635 NEXT
  1852.      IF READ.MESSAGES THEN _
  1853.         GOTO 4370
  1854. 4650 GOSUB 12979
  1855.      A$ = "End of Msgs"
  1856.      GOSUB 12979
  1857.      GOTO 20095
  1858. '
  1859. ' *****************************************************************************
  1860. ' *  O - COMMAND FROM MAIN MENU (OPERATOR PAGE)                               *
  1861. ' *****************************************************************************
  1862. '
  1863. 4700 IF NOT SYSOP.AVAILABLE GOTO 4708
  1864. 4705 A$ = "Chat. Remote Conversation"
  1865.      GOSUB 12976
  1866.      JJ = VAL(MID$(TIME$,1,2))*100 + VAL(MID$(TIME$,4,2))
  1867.      IF (JJ > START.OFFICE.HOURS AND JJ < END.OFFICE.HOURS) OR SYSOP.ANNOY THEN _
  1868.         GOTO 4710
  1869. 4707 GOTO 4750
  1870. 4708 A$ = "SYSOP is in from" + _
  1871.           STR$(START.OFFICE.HOURS) + _
  1872.           " to" + _
  1873.           STR$(END.OFFICE.HOURS) + ","
  1874.      GOSUB 12979
  1875.      GOTO 4755
  1876. 4710 A$ = "Page " + SYSOP.FIRST.NAME$ + " (Y/N)"
  1877.      CALL SKIPLINE
  1878.      GOSUB 12995
  1879.      IF NO THEN _
  1880.         RETURN
  1881.      PAGE.COUNT = 0
  1882.      A$ = "Paging " + SYSOP.FIRST.NAME$ + " now"
  1883.      GOSUB 12978
  1884.      CALL FINDTIME (PAGE.TIME.MAX!)
  1885.      PAGE.TIME.MAX! = PAGE.TIME.MAX! + 30
  1886. 4730 SUBROUTINE.PARAMETER = 1
  1887.      CALL DELAYIT
  1888. 4735 PAGE.COUNT = PAGE.COUNT + 1
  1889.      IF INKEY$ = ESCAPE$ THEN _
  1890.         GOTO 4765
  1891. 4740 IF PAGE.COUNT MOD 2 THEN _
  1892.         A$ = PAGING.PRINTER.SUPPORT$ + CHR$(7) : _
  1893.         IF LEN(PAGING.PRINTER.SUPPORT$) = 3 THEN _
  1894.            IF PRINTER THEN _
  1895.               LPRINT CHR$(7);
  1896. 4745 GOSUB 12978
  1897.      CALL FINDTIME (TI!)
  1898.      IF TI! < PAGE.TIME.MAX! THEN _
  1899.         GOTO 4730
  1900.      GOSUB 12979
  1901. 4750 A$ = SYSOP.FIRST.NAME$ + " is in from" + _
  1902.           STR$(START.OFFICE.HOURS) + _
  1903.           " to" + _
  1904.           STR$(END.OFFICE.HOURS) + _
  1905.           ", but not now"
  1906.      GOSUB 1397
  1907. 4755 A$ = "If you would like, Please leave a message or a comment"
  1908.      GOSUB 12979
  1909.      Z$ = "Operator paged " + LEFT$(TIME$ ,5)
  1910.      SUBROUTINE.PARAMETER = 2
  1911.      CALL UPDTCALR
  1912.      RETURN
  1913. 4765 Z$ = "Paged and chatted with Sysop"
  1914.      SUBROUTINE.PARAMETER = 1
  1915.      CALL UPDTCALR
  1916.      A$ = "SYSOP available! Hi, " + _
  1917.           FIRST.NAME$ + _
  1918.           ", this is " + _
  1919.           SYSOP.FIRST.NAME$ + _
  1920.           " go ahead!"
  1921.      GOSUB 12976
  1922. 4770 CM = TRUE
  1923.      CALL FINDTIME (TIME.CHAT.STARTED!)
  1924.      SUBROUTINE.PARAMETER = 1
  1925.      CALL LINE25
  1926. 4775 WHILE EOF(3)
  1927.        LOCATE ,,1
  1928.        GOSUB 60000
  1929.        A$ = KEY.PRESSED$
  1930.        IF A$ = CHR$(8) OR _
  1931.           A$ = CHR$(7) OR _
  1932.           A$ = CHR$(26) OR _
  1933.           A$ = CHR$(127) OR _
  1934.           A$ = CHR$(227) THEN _
  1935.           GOTO 4805
  1936. 4777 IF A$ = ESCAPE$ THEN _
  1937.         A$ = "" : _
  1938.         CM = 0 : _
  1939.         CALL FINDTIME (TI!) : _
  1940.         SECONDS.PER.SESSION! = SECONDS.PER.SESSION! + _
  1941.                                FIX(TI! - TIME.CHAT.STARTED!) : _
  1942.         A$ = "Chat mode terminated.  Returning to normal board operations." : _
  1943.         GOSUB 12976 : _
  1944.         GOTO 4820
  1945. 4785   IF A$ = CARRIAGE.RETURN$ THEN _
  1946.           GOTO 4811
  1947. 4790   IF A$ <> "" THEN _
  1948.           GOTO 4800
  1949. 4795 WEND
  1950. 4797 A$ = INPUT$(1,3)
  1951.      IF A$ = CHR$(8) OR _
  1952.         A$ = CHR$(127) THEN _
  1953.         GOTO 4805 _
  1954.      ELSE IF A$ = CARRIAGE.RETURN$ THEN _
  1955.         GOTO 4811
  1956. 4800 WORD.WRAP$ = WORD.WRAP$ + A$
  1957.      IF LEN(WORD.WRAP$) = 78 THEN _
  1958.         GOTO 4813 _
  1959.      ELSE GOSUB 12978 : _
  1960.           GOTO 4775
  1961. 4805 IF POS(0) > 1 THEN _
  1962.         PRINT BACK.ARROW$; : _
  1963.         PRINT #3,BACKSPACE$; : _
  1964.         QQ = LEN(WORD.WRAP$)-1 : _
  1965.         WORD.WRAP$ = LEFT$(WORD.WRAP$,QQ)
  1966. 4810 GOTO 4775
  1967. 4811 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  1968.         PRINT #3,CARRIAGE.RETURN$;
  1969.      PRINT CARRIAGE.RETURN$;
  1970.      WORD.WRAP$ = ""
  1971.      Q = 0
  1972.      IF LINE.FEEDS AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  1973.         PRINT #3,LINE.FEED$
  1974.      GOTO 4775
  1975. 4813 IF A$ = " " THEN _
  1976.         WORD.WRAP$ = "" : _
  1977.         Q = 0 : _
  1978.         GOSUB 12977 : _
  1979.         GOTO 4775
  1980.      Z = LEN(WORD.WRAP$)
  1981.      Q = 0
  1982. 4814 IF MID$(WORD.WRAP$,Z,1) = " " THEN _
  1983.         WORD.WRAP$ = MID$(WORD.WRAP$,Z + 1) _
  1984.      ELSE Z = Z - 1 : _
  1985.           Q = Q + 1 : _
  1986.           IF Q >= 70 THEN _
  1987.              GOTO 4811 _
  1988.           ELSE GOTO 4814
  1989. 4815 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  1990.         PRINT #3,STRING$(Q,8) + STRING$(Q,32) + CARRIAGE.RETURN$;
  1991.      IF LINE.FEEDS AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  1992.         PRINT #3,LINE.FEED$
  1993. 4816 LOCATE ,POS(0)-Q
  1994.      PRINT STRING$(Q,32) + CARRIAGE.RETURN$;
  1995.      A$ = WORD.WRAP$
  1996.      Q = 0
  1997.      GOSUB 12978
  1998.      GOTO 4775
  1999. 4820 IF ACTIVE.MENU$ = "U" THEN _
  2000.         RETURN 1330
  2001.      IF ACTIVE.MENU$ = "F" THEN _
  2002.         RETURN 20015
  2003.      RETURN 1200
  2004. '
  2005. ' *****************************************************************************
  2006. ' *  S - COMMAND FROM UTILITY MENU (STATISTICS)                               *
  2007. ' *****************************************************************************
  2008. '
  2009. 4850 A$ = "RBBS-PC Version " + VERSION.ID$ + " Node " + NODE.ID$
  2010.      GOSUB 12975
  2011.      IF NOT CONFERENCE.MODE THEN _
  2012.         A$ = "Caller # " + STR$(CALLS.TODATE!) + "  "
  2013. 4855 A$ = A$ + "# active msgs:" + STR$(ACTIVE.MESSAGES)
  2014.      A$ = A$ + "  Next msg #" + STR$(HIGH.MESSAGE.NUMBER + 1)
  2015.      LAST.MESSAGE.READ = -LAST.MESSAGE.READ * _
  2016.                          (LAST.MESSAGE.READ <= HIGH.MESSAGE.NUMBER)
  2017.      IF LAST.MESSAGE.READ > 0 THEN _
  2018.         A$ = A$ + "  Last msg read:" + STR$(LAST.MESSAGE.READ)
  2019. 4857 GOSUB 12976
  2020.      IF SYSOP THEN _
  2021.         USER.WORK = (HIGHEST.USER.RECORD * .95) + 1: _
  2022.         A$ = "USERS: used" + _
  2023.         STR$(CURRENT.USER.COUNT-1) + _
  2024.         " avl" + _
  2025.         STR$(USER.WORK - CURRENT.USER.COUNT) + _
  2026.         "  MSGS: used" + _
  2027.         STR$(ACTIVE.MESSAGES) + _
  2028.         " avl" + _
  2029.         STR$(MAXIMUM.MESSAGES-ACTIVE.MESSAGES) + _
  2030.         "  MSG REC: used" + _
  2031.         STR$(NEXT.MESSAGE.RECORD-1) + _
  2032.         " avl" + _
  2033.         STR$(HIGHEST.MESSAGE.RECORD + 1 + NODES.IN.SYSTEM - NEXT.MESSAGE.RECORD) : _
  2034.         GOSUB 12976
  2035. 4860 GOSUB 12979
  2036.      RETURN
  2037. 4900 CONFERENCE.MODE = TRUE
  2038.      Z$ = "Entered " + GRN$
  2039.      SUBROUTINE.PARAMETER = 1
  2040.      CALL UPDTCALR
  2041.      GRN$ = GRN$ + RETURN.LINE.FEED$
  2042.      A$ = "Welcome to " + GRN$
  2043.      GOSUB 12979
  2044. 4905 CALL FINDIT
  2045.      IF NOT OK THEN _
  2046.         GOTO 4910
  2047. 4906 GOSUB 43030
  2048.      GOSUB 6000
  2049. 4910 GOSUB 12986
  2050.      GOSUB 30500
  2051.      IF LOF(1) = 0 THEN _
  2052.         DF$ = ACTIVE.MESSAGE.FILE$ : _
  2053.         CLOSE 1 : _
  2054.         KILL ACTIVE.MESSAGE.FILE$ : _
  2055.         GOSUB 12987 : _
  2056.         GOTO 13600
  2057.      GOSUB 23000
  2058.      RETURN
  2059. '
  2060. ' *****************************************************************************
  2061. ' *  REMOVE NON ALPHA CHARACTERS FROM STRING                                  *
  2062. ' *****************************************************************************
  2063. '
  2064. 5100 X$ = ""
  2065.      FOR Z = 1 TO LEN(Z$)
  2066.        IF ASC(MID$(Z$,Z,1)) < 65 OR ASC(MID$(Z$,Z,1)) > 90 THEN _
  2067.           GOTO 5105
  2068.        X$ = X$ + MID$(Z$,Z,1)
  2069. 5105 NEXT
  2070.      Z$ = X$
  2071.      RETURN
  2072. '
  2073. ' *****************************************************************************
  2074. ' *  P - COMMAND FROM UTILITY MENU (PASSWORD CHANGE)                          *
  2075. ' *****************************************************************************
  2076. '
  2077. 5110 A$ = "Enter new password"
  2078.      GOSUB 45010
  2079.      IF Q = 0 THEN _
  2080.         RETURN
  2081.      IF LEN(B$(1)) > 15 OR B$(1) = SPACE$(LEN(B$(1))) THEN _
  2082.         GOTO 5110
  2083.      CALL ALLCAPS (B$(1))
  2084.      Z$ = B$(1)
  2085. 5120 A$ = "Reenter new password"
  2086.      GOSUB 45010
  2087.      IF Q = 0 THEN _
  2088.         RETURN
  2089.      CALL ALLCAPS (B$(1))
  2090.      IF Z$ <> B$(1) THEN _
  2091.         A$ = "Passwords don't match!" : _
  2092.         GOSUB 12979 : _
  2093.         RETURN
  2094. 5125 IF MAXIMUM.PASSWORD.CHANGES AND _
  2095.         CHANGES.THIS.SESSION > _
  2096.         MAXIMUM.PASSWORD.CHANGES AND _
  2097.         NOT SYSOP THEN _
  2098.             A$ = "No changes permitted" : _
  2099.             GOSUB 12975 : _
  2100.             RETURN _
  2101.      ELSE PASSWORD.CHANGE.ALLOWED = TRUE : _
  2102.           GOSUB 5140 : _
  2103.           IF NOT FOUND THEN _
  2104.              GOTO 5129 _
  2105.           ELSE A$ = "Temporary change" : _
  2106.                GOSUB 12975 : _
  2107.                PASSWORD$ = TEMP.PASSWORD$ : _
  2108.                SECONDS.PER.SESSION! = TEMP.TIME.ALLOWED * 60 : _
  2109.                USER.SECURITY.LEVEL = TEMP.SECURITY.LEVEL : _
  2110.                GOSUB 41070 : _
  2111.                SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  2112.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2113.         B$(1) = "********"
  2114. 5126 Z$ = "Used temporary password " + B$(1)
  2115.      SUBROUTINE.PARAMETER = 2
  2116.      CALL UPDTCALR
  2117.      GOSUB 12979
  2118.      RETURN
  2119. 5129 GOSUB 12989
  2120.      GOSUB 9400
  2121. 5130 GET 2,USER.FILE.INDEX
  2122.      CALL ALLCAPS (B$(1))
  2123.      LSET PASSWORD$ = B$(1)
  2124.      PUT 2,USER.FILE.INDEX
  2125.      CLOSE 2
  2126.      GOSUB 12991
  2127.      A$ = "Password changed"
  2128.      STOP.INTERRUPTS = FALSE
  2129.      GOSUB 12975
  2130.      IF MAXIMUM.PASSWORD.CHANGES THEN _
  2131.         CHANGES.THIS.SESSION = CHANGES.THIS.SESSION + 1
  2132. 5131 Z$ = "New Password " + B$(1)
  2133.      SUBROUTINE.PARAMETER = 2
  2134.      CALL UPDTCALR
  2135.      RETURN
  2136. '
  2137. ' *****************************************************************************
  2138. ' *  SEARCH "PASSWORDS" FILE FOR TEMPORARY PASSWORDS                          *
  2139. ' *****************************************************************************
  2140. '
  2141. 5140 FOUND = FALSE
  2142.      SWAP PASSWORDS.FILE$,FILE.NAME$
  2143.      CALL OPENWORK
  2144.      SWAP PASSWORDS.FILE$,FILE.NAME$
  2145.      IF EC = 53 THEN _
  2146.          Z$ = "Missing file " + PASSWORDS.FILE$ : _
  2147.          SUBROUTINE.PARAMETER = 2 : _
  2148.          CALL UPDTCALR : _
  2149.          IF Z = 1 THEN _
  2150.             CALL ALLCAPS (B$(1)) : _
  2151.             Z$ = B$(1) : _
  2152.             GOTO 5160 _
  2153.          ELSE GOTO 5160
  2154.      Z$ = Z$ + SPACE$(15-LEN(Z$))
  2155. 5150 IF EOF(2) THEN _
  2156.         GOTO 5160
  2157. 5151 INPUT #2,TEMP.PASSWORD$,TEMP.SECURITY.LEVEL,TEMP.TIME.ALLOWED
  2158.      IF LEN(TEMP.PASSWORD$) > 15 THEN _
  2159.         GOTO 5150
  2160.      TEMP.PASSWORD$ = TEMP.PASSWORD$ + SPACE$(15-LEN(TEMP.PASSWORD$))
  2161.      IF Z$ <> TEMP.PASSWORD$ THEN _
  2162.         GOTO 5150
  2163.      IF PASSWORD.CHANGE.ALLOWED AND _
  2164.         USER.SECURITY.LEVEL >= MINIMUM.SECURITY.FOR.TEMP.PASSWORD THEN _
  2165.         FOUND = TRUE _
  2166.      ELSE IF USER.SECURITY.LEVEL = TEMP.SECURITY.LEVEL THEN _
  2167.              FOUND = TRUE _
  2168.           ELSE 5150
  2169. 5160 RETURN
  2170. '
  2171. ' *****************************************************************************
  2172. ' *  L - COMMAND FROM MAIN MENU (LINES PER PAGE)                              *
  2173. ' *****************************************************************************
  2174. '
  2175. 5200 A$ = "CHANGE page length from" + _
  2176.           STR$(PAGE.LENGTH) + _
  2177.           " TO (0 =continuous, [ENTER]=no change)"
  2178.      GOSUB 12995
  2179.      IF Q = 0 THEN _
  2180.         GOTO 1200
  2181. 5230 A = VAL(B$(Q))
  2182.      IF A < 0 OR A > 255 THEN _
  2183.         GOTO 5200
  2184.      PAGE.LENGTH = A
  2185.      GOTO 1200
  2186. '
  2187. ' *****************************************************************************
  2188. ' *  J - COMMAND FROM MAIN MENU (JOIN CONFERENCE)                             *
  2189. ' *****************************************************************************
  2190. '
  2191. 5300 FILE.NAME$ = CONFERENCE.MENU$
  2192.      CALL FINDIT
  2193.      IF NOT OK THEN _
  2194.         A$ = "There are no Active Conferences available!" : _
  2195.         GOSUB 12976 : _
  2196.         GOTO 2210
  2197. 5310 IF Q > 1 THEN _
  2198.         B$(1) = B$(2) : _
  2199.         Q = 0 : _
  2200.         IF LEN(B$(2)) > 1 OR _
  2201.           (LEN(B$(2)) = 1 AND NOT INSTR("JLMQX",B$(2))) THEN _
  2202.            GOTO 5322 _
  2203.         ELSE GOTO 5317
  2204. 5312 IF EXPERT.USER THEN _
  2205.         GOTO 5315
  2206. 5313 FILE.NAME$ = CONFERENCE.MENU$
  2207.      GOSUB 43025
  2208. 5315 A$ = "Conference Function <J>oin, <L>ist, <M>ain, <Q>uit, <X>pert"
  2209.      GOSUB 12995
  2210.      IF Q = 0 THEN _
  2211.         GOSUB 12979 : _
  2212.         RETURN _
  2213.      ELSE Z$ = B$(1)
  2214. 5317 CALL ALLCAPS (B$(1))
  2215.      IF B$(1) = "X" THEN _
  2216.         GOSUB 4240 : _
  2217.         GOTO 5312
  2218.      FF = INSTR("JLMQ",B$(1))
  2219.      IF FF = 0 THEN _
  2220.         GOTO 5312
  2221.      ON FF GOTO 5320,5313,5350,2210
  2222. 5320 IF Q > 1 THEN _
  2223.         B$(1) = B$(2) : _
  2224.         GOTO 5322
  2225.      A$ = "Enter conference name"
  2226.      GOSUB 12995
  2227.      IF Q = 0 THEN _
  2228.         GOTO 5312
  2229. 5322 IF SYSOP OR LOCAL.USER THEN _
  2230.         GOSUB 5700
  2231. 5323 CALL ALLCAPS (B$(1))
  2232.      GRN$ = B$(1)
  2233.      Q = 0
  2234.      IF LEN(GRN$) > 7 THEN _
  2235.         EXPERT.USER = FALSE : _
  2236.         GOTO 5312
  2237.      ACTIVE.MESSAGE.FILE$ = MID$(MAIN.MESSAGE.FILE$,1,2) + GRN$ + "M.DEF"
  2238.      FILE.NAME$ = ACTIVE.MESSAGE.FILE$
  2239.      CALL FINDIT
  2240.      IF OK THEN _
  2241.         GOTO 5324
  2242.      ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$
  2243.      GRN$ = ""
  2244.      GOTO 5312
  2245. 5324 FILE.NAME$ = MID$(WELCOME.FILE$,1,2) + GRN$ + "W.DEF"
  2246. 5325 IF ACTIVE.USER.NAME$ <> "SYSOP" THEN _
  2247.         IF NOT (CONFERENCE.MODE AND (ACTIVE.USER.FILE$ = MAIN.USER.FILE$)) THEN _
  2248.            GOSUB 12988 : _
  2249.            GOSUB 9400 : _
  2250.            GET 2,MAIN.USER.FILE.INDEX : _
  2251.            GOSUB 9600 : _
  2252.            PUT 2,MAIN.USER.FILE.INDEX : _
  2253.            GOSUB 12990
  2254. 5327 ACTIVE.USER.FILE$ = MID$(ACTIVE.USER.FILE$,1,2) + GRN$ + "U.DEF"
  2255.      UPDATE.DATE = TRUE
  2256.      Z$ = FILE.NAME$
  2257.      FILE.NAME$ = ACTIVE.USER.FILE$
  2258.      CALL FINDIT
  2259.      FILE.NAME$ = Z$
  2260.      IF OK THEN _
  2261.         GOTO 5330
  2262.       ACTIVE.USER.FILE$ = MAIN.USER.FILE$
  2263.       UPDATE.DATE = FALSE
  2264.       GOSUB 12986
  2265.       GOSUB 30500
  2266.       GET 1,1
  2267.       MID$(MESSAGE.RECORD$,57,5) = STR$(CURRENT.USER.COUNT)
  2268.       MID$(MESSAGE.RECORD$,62,5) = STR$(HIGHEST.USER.RECORD)
  2269.       PUT 1,1
  2270.       GOSUB 12987
  2271.       TIX = MAIN.USER.FILE.INDEX
  2272.       GOTO 5345
  2273. 5330 IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2274.         GOTO 5345
  2275.      TEMP.USER.NAME$ = ACTIVE.USER.NAME$
  2276.      GOSUB 12600
  2277.      GOSUB 12984
  2278. 5340 IF FOUND THEN _
  2279.         USER.FILE.INDEX = LOC(2) : _
  2280.         TIX = USER.FILE.INDEX : _
  2281.         GOSUB 9500 : _
  2282.         GOTO 5345
  2283.      A$ = "You are not a member of the " + GRN$ + " conference!"
  2284.      GOSUB 1397
  2285.      GRN$ = ""
  2286.      USER.FILE.INDEX = MAIN.USER.FILE.INDEX
  2287.      ACTIVE.USER.FILE$ = MAIN.USER.FILE$
  2288.      ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$
  2289.      GOSUB 30500
  2290.      GOSUB 23000
  2291.      CONFERENCE.MODE = FALSE
  2292.      GOSUB 12979
  2293.      RETURN
  2294. 5345 GRN$ = GRN$ + " Conference"
  2295.      IF UPDATE.DATE AND ACTIVE.USER.NAME$ <> "SYSOP" THEN _
  2296.         LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  2297.                                   " " + _
  2298.                                   TIME.LOGGED.ON$ : _
  2299.         PUT 2,USER.FILE.INDEX : _
  2300.         GOSUB 12991
  2301. 5347 GOSUB 4900
  2302.      GOSUB 12987
  2303.      RETURN 900
  2304. 5350 GRN$ = ""
  2305.      Q = 0
  2306.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2307.         GOSUB 5700 : _
  2308.         ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  2309.         ACTIVE.USER.FILE$ = MAIN.USER.FILE$ : _
  2310.         CONFERENCE.MODE = FALSE : _
  2311.         GOSUB 12979 : _
  2312.         GOSUB 1900 : _
  2313.         RETURN 1200
  2314.      Z$ = "Exited Conference "
  2315.      SUBROUTINE.PARAMETER = 1
  2316.      CALL UPDTCALR
  2317. 5360 IF CONFERENCE.MODE AND (ACTIVE.USER.FILE$ <> MAIN.USER.FILE$) THEN _
  2318.         GOSUB 12988 : _
  2319.         GOSUB 9400 : _
  2320.         GET 2,TIX : _
  2321.         GOSUB 9600 : _
  2322.         PUT 2,TIX : _
  2323.         GOSUB 12990
  2324. 5362 IF CONFERENCE.MODE THEN _
  2325.         ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  2326.         ACTIVE.USER.FILE$ = MAIN.USER.FILE$ : _
  2327.         CONFERENCE.MODE = FALSE : _
  2328.         GOSUB 9400 : _
  2329.         USER.FILE.INDEX = MAIN.USER.FILE.INDEX : _
  2330.         GET 2,USER.FILE.INDEX : _
  2331.         GOSUB 9500 : _
  2332.         GOSUB 1900
  2333.      GOSUB 12979
  2334.      RETURN
  2335. '
  2336. ' *****************************************************************************
  2337. ' *  R - COMMAND FROM UTILITY MENU (REVIEW PROFILE)                           *
  2338. ' *****************************************************************************
  2339. '
  2340. 5400 A$ = "Your PROFILE (utilities reset)"
  2341.      GOSUB 12976
  2342. 5410 EXPERT.USER = NOT EXPERT.USER
  2343.      GOSUB 4240
  2344.      GOSUB 43020
  2345.      FF = INSTR("AMXC",USER.TRANSFER.DEFAULT$)
  2346.      FF = FF-5*(FF < 1)
  2347.      GOSUB 42810
  2348.      UPPER.CASE = NOT UPPER.CASE
  2349.      GOSUB 42960
  2350.      LINE.FEEDS = NOT LINE.FEEDS
  2351.      GOSUB 4100
  2352.      GOSUB 42720
  2353.      PROMPT.BELL = NOT PROMPT.BELL
  2354.      GOTO 4200
  2355. '
  2356. ' *****************************************************************************
  2357. ' *  B - COMMAND FROM UTILITY MENU (300 TO 450 BAUD CHANGE)                   *
  2358. ' *****************************************************************************
  2359. '
  2360. 5500 IF BPS <> -1 THEN _
  2361.         A$ = "only 300 baud can change speed" : _
  2362.         GOSUB 1397 : _
  2363.         RETURN
  2364. 5507 A$ = "Change to 450 baud"
  2365.      GOSUB 12995
  2366.      IF NOT YES THEN _
  2367.         RETURN
  2368. 5510 A$ = "Change. Then press [ENTER] until I respond"
  2369.      GOSUB 12979
  2370.      SUBROUTINE.PARAMETER = 9
  2371.      CALL DELAYIT
  2372.      C = 0
  2373.      BAUD.RATE.DIVISOR = &H100
  2374.      CALL SETBAUD
  2375. 5530 C = C + 1
  2376.      CALL CARRIER
  2377.      IF SUBROUTINE.PARAMETER = -1 THEN _
  2378.         GOTO 10595
  2379.      IF C = 20 THEN _
  2380.         Z$ = "Baud change failed" : _
  2381.         SUBROUTINE.PARAMETER = 1 : _
  2382.         CALL UPDTCALR : _
  2383.         GOTO 10595
  2384.      SUBROUTINE.PARAMETER = 1
  2385.      CALL DELAYIT
  2386. 5535 IF EOF(3) THEN _
  2387.         GOTO 5530
  2388. 5536 IF ASC(INPUT$(1,3)) = 13 THEN _
  2389.         GOTO 5540
  2390. 5537 GOTO 5530
  2391. 5540 Z$ = "Changed to 450 baud"
  2392.      SUBROUTINE.PARAMETER = 2
  2393.      CALL UPDTCALR
  2394.      A$ = Z$
  2395.      GOSUB 12979
  2396.      BPS = -2
  2397.      RETURN
  2398. '
  2399. ' *****************************************************************************
  2400. ' *  PROVIDE (Y),N,NS MESSAGES FOR TEXT FILES LONGER THAN PAGE LENGTH         *
  2401. ' *****************************************************************************
  2402. '
  2403. 5600 GOSUB 41000
  2404.      CALL FINDTIME(AUTO.LOGOFF!)
  2405.      AUTO.LOGOFF! = AUTO.LOGOFF! + WAIT.BEFORE.DISCONNECT
  2406.      IF NON.STOP THEN _
  2407.         RETURN _
  2408.      ELSE A$ = "More (Y),N,NS" : _
  2409.           GOSUB 12995 : _
  2410.           RETURN
  2411. '
  2412. ' *****************************************************************************
  2413. ' *  SAVE SYSOP LAST MESSAGE READ POINTER                                     *
  2414. ' *****************************************************************************
  2415. '
  2416. 5700 GOSUB 12986
  2417.      GOSUB 30500
  2418.      GET 1,1
  2419.      MID$(MESSAGE.RECORD$,123,4)=MID$(STR$(LAST.MESSAGE.READ),2)
  2420.      PUT 1,1
  2421.      GOSUB 12985
  2422.      RETURN
  2423. '
  2424. ' *****************************************************************************
  2425. ' *  V - COMMAND FROM MAIN MENU (VIEW CONFERENCES)                            *
  2426. ' *****************************************************************************
  2427. '
  2428. 5800 A$ = "The V)iew Conferences command has not been implemented!"
  2429.      GOSUB 12976
  2430.      RETURN
  2431. '
  2432. ' *****************************************************************************
  2433. ' *  DISPLAY TEXT FILES & SCAN DIRECTORIES                                    *
  2434. ' *****************************************************************************
  2435. '
  2436. 6000 IF STOP.INTERRUPTS THEN _
  2437.         A$ = "* <Ctrl K> or <Ctrl X> aborts <Ctrl S> suspends *" : _
  2438.         GOSUB 12976
  2439. 6020 CK = 0
  2440.      GOTO 7100
  2441. 6030 Q = -1
  2442.      CK = 0
  2443.      GOTO 7110
  2444. 6080 A$ = "Missing file " + FILE.NAME$ + ". Please tell SYSOP"
  2445.      GOSUB 12979
  2446.      RETURN
  2447. '
  2448. ' *****************************************************************************
  2449. ' *  SCAN DIRECTORIES (PRINT TEXT)                                            *
  2450. ' *****************************************************************************
  2451. '
  2452. 7000 A$ = "Scanning Directory " + _
  2453.           MID$(FILE.NAME$,3,INSTR(FILE.NAME$,".")-3) + _
  2454.           " for " + _
  2455.           A1$
  2456.      GOSUB 12979
  2457.      PG = TRUE
  2458. 7100 CALL OPENWORK
  2459.      IF EC = 53 THEN _
  2460.          Z$ = "Missing File " + FILE.NAME$ : _
  2461.          SUBROUTINE.PARAMETER = 2 : _
  2462.          CALL UPDTCALR : _
  2463.          GOTO 6080
  2464.      Q = 0
  2465.      FF = PAGE.LENGTH-1
  2466. 7110 IF EOF(2) OR (INP(MODEM.STATUS.REGISTER) < 128 AND NOT LOCAL.USER) THEN _
  2467.         GOTO 7260
  2468. 7120 IF PAGE.LENGTH AND Q >= 0 THEN _
  2469.         IF Q >= FF THEN _
  2470.            GOSUB 5600 : _
  2471.            IF NO THEN _
  2472.               GOTO 7260 _
  2473.            ELSE Q = 0
  2474. 7130 LINE INPUT #2,A$
  2475.      IF CK = 0 THEN _
  2476.         GOTO 7250
  2477. 7157 IF CK > 1 THEN _
  2478.         CALL ALLCAPS (A$) : _
  2479.         Z$ = A$ : _
  2480.         XXX = (INSTR(Z$,RS$) = 0) : _
  2481.         GOTO 7190
  2482. 7160 A = INSTR(9,MID$(A$,1,32),"/")
  2483.      IF A = 0 THEN _
  2484.         A = INSTR(9,MID$(A$,1,32),"-")
  2485. 7162 IF A < 3 THEN _
  2486.         GOTO 7110
  2487.      IF INSTR("0123456789",MID$(A$,A-1,1)) = 0 THEN _
  2488.         GOTO 7110
  2489.      A = A-2
  2490.      KEE$ = RIGHT$(MID$(A$,A,8),2) + _
  2491.             LEFT$(MID$(A$,A,8),2) + _
  2492.             MID$(MID$(A$,A,8),4,2)
  2493.      IF MID$(KEE$,3,1) = " " THEN _
  2494.         MID$(KEE$,3,1) = "0"
  2495. 7185 IF MID$(KEE$,5,1) = " " THEN _
  2496.         MID$(KEE$,5,1) = "0"
  2497. 7189 XXX = (KEE$ < RS$)
  2498. 7190 IF XXX THEN _
  2499.         GOTO 7110
  2500.      IF PG THEN _
  2501.         PG = FALSE : _
  2502.         CALL OPENWORK : _
  2503.         Q = 0 : _
  2504.         GOTO 7110
  2505. 7200 IF PG THEN _
  2506.         GOTO 7110
  2507. 7250 GOSUB 12979
  2508.      Q = Q-(Q >= 0)
  2509.      IF NOT RET THEN _
  2510.         GOTO 7110
  2511. 7260 A$ = ""
  2512.      Q = 0
  2513.      CLOSE 2
  2514.      CALL CARRIER
  2515.      IF SUBROUTINE.PARAMETER = -1 THEN _
  2516.         GOTO 10595
  2517.      RETURN
  2518. '
  2519. ' *****************************************************************************
  2520. ' *  FORMAT MESSAGE HEADER INFORMATION FOR DISPLAY                            *
  2521. ' *****************************************************************************
  2522. '
  2523. 8000 GOSUB 12979
  2524.      IF RET THEN _
  2525.         RETURN
  2526. 8020 IF MID$(MESSAGE.RECORD$,37,5) = "ALL  " THEN _
  2527.         MESSAGE.TO$ = "ALL" : _
  2528.         GOTO 8040
  2529. 8030 MESSAGE.TO$ = MID$(MESSAGE.RECORD$,37,22)
  2530.      MESSAGE.TO$ = LEFT$(MESSAGE.TO$ + SPACE$(2),INSTR(MESSAGE.TO$ +SPACE$(2),SPACE$(2))-1)
  2531. 8040 SUBJECT$ = MID$(MESSAGE.RECORD$,76,25)
  2532.      SUBJECT$ = LEFT$(SUBJECT$ + SPACE$(2),INSTR(SUBJECT$ +SPACE$(2),SPACE$(2))-1)
  2533.      IF PASSWORD.FAILED THEN _
  2534.         SUBJECT$ = SJ$
  2535. 8050 MESSAGE.FROM$ = MID$(MESSAGE.RECORD$,6,31)
  2536.      MESSAGE.FROM$ = LEFT$(MESSAGE.FROM$ + SPACE$(2),INSTR(MESSAGE.FROM$ +SPACE$(2),SPACE$(2))-1)
  2537.      A$ = "Msg # " + _
  2538.           LEFT$(MESSAGE.RECORD$,5) + _
  2539.           " Dated " + _
  2540.           MID$(MESSAGE.RECORD$,68,8) + _
  2541.           " " + _
  2542.           MID$(MESSAGE.RECORD$,59,8)
  2543.      IF NOT RET THEN _
  2544.         A$ = A$ + _
  2545.              RETURN.LINE.FEED$ + _
  2546.              " From: " + _
  2547.              MESSAGE.FROM$ + _
  2548.              RETURN.LINE.FEED$ + _
  2549.              "   To: " + _
  2550.              MESSAGE.TO$ + _
  2551.              RETURN.LINE.FEED$ + _
  2552.              "   Re: " + _
  2553.              SUBJECT$
  2554.      IF NOT READ.MESSAGES THEN _
  2555.         GOTO 8080
  2556.      IF ADDRESSED.TO.USER THEN _
  2557.         GOTO 8076
  2558.      IF MESSAGE.TO$ = "ALL"  THEN _
  2559.         GOTO 8080
  2560.      IF NOT SYSOP THEN _
  2561.         GOTO 8080
  2562.      IF INSTR(MESSAGE.TO$,"SYSOP") > 0 OR _
  2563.         INSTR(MESSAGE.TO$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$) > 0 THEN _
  2564.         GOTO 8076
  2565.      GOTO 8080
  2566. 8076 IF MID$(MESSAGE.RECORD$,123,6) = STRING$(6,0) OR _
  2567.         MID$(MESSAGE.RECORD$,123,6) = SPACE$(6) THEN _
  2568.         GOTO 8077
  2569.      YY$= RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,126,1))),2)+ ":" + _
  2570.           RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,127,1))),2)+ ":" + _
  2571.           RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,128,1))),2)
  2572.      FOR I = 1 TO 8
  2573.         IF MID$(YY$,I,1) = " " THEN _
  2574.            MID$(YY$,I,1) = "0"
  2575.      NEXT
  2576.      YY$ = YY$ + " on "
  2577.      YY$ = YY$ + _
  2578.           RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,123,1))),2)+ "/" + _
  2579.           RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,124,1))),2)+ "/" + _
  2580.           RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,125,1))),2)
  2581.      FOR I = 13 TO 20
  2582.         IF MID$(YY$,I,1) = " " THEN _
  2583.            MID$(YY$,I,1) = "0"
  2584.      NEXT
  2585.      A$ = A$ + " Last read at " + YY$
  2586. 8077 YY$ = DATE$
  2587.      ZZ$ = TIME$
  2588.      MID$(MESSAGE.RECORD$,123,6) = CHR$(VAL(MID$(YY$,1,2))) + _
  2589.                                    CHR$(VAL(MID$(YY$,4,2))) + _
  2590.                                    CHR$(VAL(MID$(YY$,9,2))) + _
  2591.                                    CHR$(VAL(MID$(ZZ$,1,2))) + _
  2592.                                    CHR$(VAL(MID$(ZZ$,4,2))) + _
  2593.                                    CHR$(VAL(MID$(ZZ$,7,2)))
  2594.      GOSUB 12986
  2595.      PUT 1,M(MESSAGE.DIM.INDEX,1)
  2596.      GOSUB 12987
  2597. 8080 GOSUB 12979
  2598.      RETURN
  2599. '
  2600. ' *****************************************************************************
  2601. ' * UNCOMPRESS MESSAGE PRIOR TO DISPLAY                                       *
  2602. ' *****************************************************************************
  2603. '
  2604. 9000 GOSUB 12979
  2605.      Q = 4
  2606.      FOR X = 2 TO VAL(MID$(MESSAGE.RECORD$,118))
  2607.        GOSUB 12978
  2608.        EOL = FALSE
  2609.        J = 1
  2610.        GET 1
  2611. 9050   B = INSTR(J,MESSAGE.RECORD$,CHR$(227))
  2612.        IF RET THEN _
  2613.           RETURN
  2614. 9060   C = B-J
  2615.        IF C < 0 THEN _
  2616.           C = 128 : _
  2617.           EOL = TRUE
  2618. 9070   A$ = MID$(MESSAGE.RECORD$,J,C)
  2619.        IF EOL THEN _
  2620.           GOTO 9090
  2621. 9085   J = B + 1
  2622.        GOSUB 57100
  2623.        GOTO 9050
  2624. 9090 NEXT
  2625.      A$ = ""
  2626.      RETURN
  2627. '
  2628. ' *****************************************************************************
  2629. ' *  T - COMMAND FROM UTILITY MENU (TIME ON SYSTEM)                           *
  2630. ' *****************************************************************************
  2631. '
  2632. 9100 GOSUB 12979
  2633.      GOSUB 9140
  2634.      SUBROUTINE.PARAMETER = 2
  2635.      CALL AMORPM
  2636.      A$ = "Now " + TIM$ + "  Time on: "
  2637.      IF HHH > 0 THEN _
  2638.         A$ = A$ + STR$(HHH) + " Hrs"
  2639. 9110 A$ = A$ + STR$(MMM) + " Min &" + STR$(SSS) + " Sec"
  2640.      GOSUB 12979
  2641.      RETURN
  2642. 9140 H = VAL(MID$(TIME.LOGGED.ON$,1,2))
  2643.      M = VAL(MID$(TIME.LOGGED.ON$,4,2))
  2644.      S = VAL(MID$(TIME.LOGGED.ON$,7,2))
  2645.      HH = VAL(MID$(TIME$ ,1,2))
  2646.      MM = VAL(MID$(TIME$ ,4,2))
  2647.      JJ = VAL(MID$(TIME$ ,7,2))
  2648.      IF S <= JJ THEN _
  2649.         SSS = JJ-S _
  2650.      ELSE SSS = 60-(S-JJ) : _
  2651.           M = M + 1
  2652. 9150 IF M <= MM THEN _
  2653.         MMM = MM-M _
  2654.      ELSE MMM = 60-(M-MM) : _
  2655.           H = H + 1
  2656. 9160 IF H <= HH THEN _
  2657.         HHH = HH-H : _
  2658.         RETURN _
  2659.      ELSE HHH = 24-(H-HH) : _
  2660.           RETURN
  2661. '
  2662. ' *****************************************************************************
  2663. ' * OPEN AND DEFINE USER FILE RECORD VARIABLES                                *
  2664. ' *****************************************************************************
  2665. '
  2666. 9400 CLOSE 2
  2667.      IF SHARE.IT THEN _
  2668.         OPEN ACTIVE.USER.FILE$ FOR RANDOM SHARED AS #2 LEN=128 _
  2669.         ELSE OPEN "R",2,ACTIVE.USER.FILE$,128
  2670.      FIELD 2,31 AS USER.NAME$, _
  2671.              15 AS PASSWORD$, _
  2672.               2 AS SECURITY.LEVEL$, _
  2673.              14 AS USER.OPTIONS$,  _
  2674.              24 AS CITY.STATE$, _
  2675.              19 AS MACHINE.TYPE$, _
  2676.              14 AS LAST.DATE.TIME.ON$, _
  2677.               3 AS LIST.NEW.DATE$, _
  2678.               2 AS USER.DOWNLOADS$, _
  2679.               2 AS USER.UPLOADS$, _
  2680.               2 AS ELAPSED.TIME$
  2681.      FIELD 2,128 AS USER.RECORD$
  2682.      RETURN
  2683. '
  2684. ' *****************************************************************************
  2685. ' * GET USER DEFAULTS                                                         *
  2686. ' *****************************************************************************
  2687. '
  2688. 9500 USER.SECURITY.LEVEL = CVI(SECURITY.LEVEL$)
  2689.      LAST.MESSAGE.READ = CVI(MID$(USER.OPTIONS$,3,2))
  2690.      USER.TRANSFER.DEFAULT$ = MID$(USER.OPTIONS$,5,1)
  2691.      GR = VAL(MID$(USER.OPTIONS$,6,1))
  2692.      IF NOT EIGHT.BIT THEN _
  2693.         GR = 0
  2694.      USER.GRAPHIC.DEFAULT$ = MID$(" GC",GR + 1,-(GR > 0))
  2695.      RIGHT.MARGIN = CVI(MID$(USER.OPTIONS$,7,2))
  2696. 9510 USER.OPTIONS = CVI(MID$(USER.OPTIONS$,9,2))
  2697.      PROMPT.BELL = (USER.OPTIONS AND 1) > 0
  2698.      EXPERT.USER = (USER.OPTIONS AND 2) > 0
  2699.      NULLS = (USER.OPTIONS AND 4) > 0
  2700.      UPPER.CASE = (USER.OPTIONS AND 8) > 0
  2701.      LINE.FEEDS = (USER.OPTIONS AND 16) > 0
  2702.      PAGE.LENGTH = ASC(MID$(USER.OPTIONS$,13))
  2703. 9520 NUL$ = MID$(STRING$(5,0),1,-5*NULLS)
  2704.      CALL SETCRLF
  2705.  
  2706.      RETURN
  2707. '
  2708. ' *****************************************************************************
  2709. ' * UPDATE USER DEFAULTS                                                      *
  2710. ' *****************************************************************************
  2711. '
  2712. 9600 LSET USER.OPTIONS$ = MKI$(TIMES.LOGGED.ON) + _
  2713.                           MKI$(LAST.MESSAGE.READ) + _
  2714.                           USER.TRANSFER.DEFAULT$ + _
  2715.                           MID$(STR$(GR),2,1) + _
  2716.                           MKI$(RIGHT.MARGIN) + _
  2717.                           MKI$(-PROMPT.BELL-2*EXPERT.USER-4*NULLS-8*UPPER.CASE-16*LINE.FEEDS) + _
  2718.                           MKI$(0) + _
  2719.                           CHR$(PAGE.LENGTH) + _
  2720.                           STRING$(1,0)
  2721.      RETURN
  2722. '
  2723. ' *****************************************************************************
  2724. ' *  B - COMMAND FROM MAIN MENU (READ BULLETINS)                              *
  2725. ' *****************************************************************************
  2726. '
  2727. 9700 IF ACTIVE.BULLETINS < 1 THEN _
  2728.         A$ = "no bulletins today" : _
  2729.         GOSUB 1397 : _
  2730.         RETURN
  2731. 9705 FILE.NAME$ = BULLETIN.MENU$
  2732.      GOSUB 1790
  2733. 9707 GOSUB 41000
  2734.      NON.STOP = FALSE
  2735.      A$ = "Bulletin # 1 thru" + STR$(ACTIVE.BULLETINS) + _
  2736.           ", L)ist, Press [ENTER] to Continue"
  2737.      CALL SKIPLINE
  2738.      GOSUB 12995
  2739.      IF Q = 0 THEN _
  2740.         GOSUB 12979 : _
  2741.         RETURN
  2742. 9708 CALL ALLCAPS (B$(1))
  2743.      IF B$(1) = "L" THEN _
  2744.         GOTO 9705
  2745. 9711 Z$ = B$(1)
  2746.      IF VAL(Z$) > 0 AND VAL(Z$) <= ACTIVE.BULLETINS THEN _
  2747.         GOTO 9720
  2748.      GOTO 9705
  2749. 9720 WHILE LEFT$(B$(1),1) = " "
  2750.         B$(1) = MID$(B$(1),2)
  2751.      WEND
  2752.      Z$ = "Read Bulletin # " + B$(1)
  2753.      SUBROUTINE.PARAMETER = 1
  2754.      CALL UPDTCALR
  2755.      CALL ALLCAPS (B$(1))
  2756.      FILE.NAME$ = BULLETIN.PREFIX$ + B$(1)
  2757.      STOP.INTERRUPTS = TRUE
  2758.      GOSUB 1790
  2759.      STOP.INTERRUPTS = FALSE
  2760.      GOSUB 41050
  2761.      GOTO 9707
  2762. '
  2763. ' *****************************************************************************
  2764. ' *  W - COMMAND FROM MAIN MENU (WHO'S ON THE OTHER NODES)                    *
  2765. ' *****************************************************************************
  2766. '
  2767. 9800 IF CONFERENCE.MODE THEN _
  2768.         A$ = "Nodes won't display within a conference!" : _
  2769.         GOSUB 12977 : _
  2770.         RETURN
  2771.      GOSUB 12979
  2772.      GOSUB 30500
  2773.      FOR NODE.INDEX = 2 TO NODES.IN.SYSTEM + 1
  2774.         GET 1,NODE.INDEX
  2775.         A$ = MID$(MESSAGE.RECORD$,1,31) + _
  2776.         "Node" + _
  2777.         STR$(NODE.INDEX - 1) + _
  2778.         LEFT$(" in",1-2*(MID$(MESSAGE.RECORD$,57,1) <> "A")) + _
  2779.         "active " + _
  2780.         MID$(MESSAGE.RECORD$,60,4) + _
  2781.         " Baud"
  2782.         GOSUB 12979
  2783.      NEXT
  2784.      RETURN
  2785. '
  2786. ' *****************************************************************************
  2787. ' *  1 - COMMAND FROM SYSOP MENU (DISPLAY COMMENTS)                           *
  2788. ' *****************************************************************************
  2789. '
  2790. 10070 FILE.NAME$ = COMMENTS.FILE$
  2791.       GOSUB 6000
  2792.       RETURN
  2793. '
  2794. ' *****************************************************************************
  2795. ' *  U - COMMAND FROM UTILITY MENU (DISPLAY USERS)                            *
  2796. ' *  2 - COMMAND FROM SYSOP MENU (DISPLAY USERS)                              *
  2797. ' *****************************************************************************
  2798. '
  2799. 10090 A$ = "List - <U>sers, <R>ecent callers, Press [ENTER] to quit"
  2800.       CALL SKIPLINE
  2801.       GOSUB 12995
  2802.       IF Q = 0 THEN _
  2803.          RETURN
  2804.       CALL ALLCAPS (B$(1))
  2805.       ON INSTR("UR",B$(1)) + 1 GOTO 10090,10096,10100
  2806. 10096 GOSUB 12700
  2807.       GOSUB 9400
  2808.       STOP.INTERRUPTS = TRUE
  2809.       Q = 0
  2810.       FOR I = 1 TO HIGHEST.USER.RECORD-1
  2811.         GET 2,I
  2812.         IF ASC(USER.NAME$) = 0 OR LEFT$(USER.NAME$,3) = "   " THEN _
  2813.            GOTO 10099
  2814.         A$ = LEFT$(USER.NAME$,20) + _
  2815.              CITY.STATE$ + _
  2816.              MACHINE.TYPE$ + _
  2817.              LAST.DATE.TIME.ON$
  2818.         GOSUB 12979
  2819.         IF RET THEN _
  2820.            RETURN
  2821.         GOSUB 57110
  2822. 10099 NEXT
  2823.       STOP.INTERRUPTS = FALSE
  2824.       RETURN
  2825. 10100 GOTO 57000
  2826. '
  2827. ' *****************************************************************************
  2828. ' *  3 - COMMAND FROM SYSOP MENU (RECOVER MESSAGE)                            *
  2829. ' *****************************************************************************
  2830. '
  2831. 10390 A$ = "Recover Msg #"
  2832.       GOSUB 12995
  2833.       MESSAGE.TO.RECOVER = VAL(B$(1))
  2834.       IF MESSAGE.TO.RECOVER < 1 THEN _
  2835.          GOTO 12980
  2836. 10410 MESSAGE.RECORD = FIRST.MESSAGE.RECORD
  2837.       GOSUB 12979
  2838.       GOSUB 30500
  2839. 10420 GET 1,MESSAGE.RECORD
  2840.       NUMBER.RECORDS.IN.MESSAGE = VAL(MID$(MESSAGE.RECORD$,118))
  2841.       IF NUMBER.RECORDS.IN.MESSAGE < 1 THEN _
  2842.          A$ = "USE CONFIG OPTION 145 TO FIX YOUR MESSAGE FILE" : _
  2843.          GOSUB 12979 : _
  2844.          RETURN
  2845.       IF MESSAGE.RECORD >= NEXT.MESSAGE.RECORD THEN _
  2846.          A$ = "No Msg #" + STR$(MESSAGE.TO.RECOVER) : _
  2847.          GOSUB 12979 : _
  2848.          RETURN
  2849. 10440 IF VAL(MID$(MESSAGE.RECORD$,2,4)) <> MESSAGE.TO.RECOVER THEN _
  2850.          MESSAGE.RECORD = MESSAGE.RECORD + NUMBER.RECORDS.IN.MESSAGE : _
  2851.          GOTO 10420
  2852. 10450 IF INSTR(MESSAGE.RECORD$,DELETED.MESSAGE$) <> 0 THEN _
  2853.          GOSUB 12986 : _
  2854.          LSET MESSAGE.RECORD$ = LEFT$(MESSAGE.RECORD$,115) + _
  2855.                                 ACTIVE.MESSAGE$ + _
  2856.                                 MID$(MESSAGE.RECORD$,117) : _
  2857.          PUT 1,LOC(1) : _
  2858.          GOSUB 12987 : _
  2859.          A$ = "Restored Msg #" + STR$(MESSAGE.TO.RECOVER) : _
  2860.          GOSUB 12979 : _
  2861.          GOTO 10490
  2862. 10480 A$ = "Msg #" + STR$(MESSAGE.TO.RECOVER) + " not Dead"
  2863.       GOSUB 12979
  2864.       RETURN
  2865. 10490 A$ = "Re-Loading Msg File"
  2866.       GOSUB 12979
  2867.       GOSUB 1900
  2868.       RETURN
  2869. '
  2870. ' *****************************************************************************
  2871. ' *  4 - COMMAND FROM SYSOP MENU (DELETE COMMENTS)                            *
  2872. ' *****************************************************************************
  2873. '
  2874. 10530 A$ = "Delete comments (Y/N)"
  2875.       GOSUB 12995
  2876.       IF YES THEN _
  2877.          CLOSE 2 : _
  2878.          IF SHARE.IT THEN _
  2879.             OPEN COMMENTS.FILE$ FOR OUTPUT SHARED AS #2 _
  2880.          ELSE OPEN "O",2,COMMENTS.FILE$
  2881.       CLOSE 2
  2882. 10550 GOTO 20095
  2883. 10553 Z$ = "time limit exceeded!"
  2884.       SUBROUTINE.PARAMETER = 1
  2885.       CALL UPDTCALR
  2886.       IF LIMIT.DAILY.TIME THEN _
  2887.          A$ = "Daily time limit exceeded!  Please try tomorrow" _
  2888.       ELSE A$ = "Session time limit exceeded."
  2889.       GOSUB 1397
  2890. 10555 IF KG THEN _
  2891.          RETURN
  2892. '
  2893. ' *****************************************************************************
  2894. ' *  G - COMMAND FROM MAIN MENU (GOODBYE)                                     *
  2895. ' *  G - COMMAND FROM FILES MENU (GOODBYE)                                    *
  2896. ' *****************************************************************************
  2897. '
  2898. 10560 GOSUB 9100
  2899.       A$ = FIRST.NAME$ + ", Thanks for calling and please call again!"
  2900.       GOSUB 12979
  2901.       IF BPS = -1 THEN _
  2902.          SUBROUTINE.PARAMETER = 1 : _
  2903.          CALL DELAYIT
  2904.       Z$ = "Logged off"
  2905.       SUBROUTINE.PARAMETER = 1
  2906.       CALL UPDTCALR
  2907.       GOTO 10595
  2908. 10590 Z$ = "Sleep Disconnect "
  2909.       SUBROUTINE.PARAMETER = 1
  2910.       CALL UPDTCALR
  2911. 10595 GOSUB 9140
  2912.       GOSUB 13700
  2913.       IF SYSOP OR LOCAL.USER THEN _
  2914.          GOSUB 5700
  2915.       IF USER.FILE.INDEX < 1 THEN _
  2916.          CLS : _
  2917.          GOTO 13540
  2918.       IF CONFERENCE.MODE AND (ACTIVE.USER.FILE$ <> MAIN.USER.FILE$) THEN _
  2919.          GOSUB 12989 : _
  2920.          GOSUB 9400 : _
  2921.          GET 2,TIX : _
  2922.          GOSUB 9600 : _
  2923.          PUT 2,TIX : _
  2924.          GOSUB 12991
  2925. 10598 IF CONFERENCE.MODE THEN _
  2926.          ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  2927.          ACTIVE.USER.FILE$ = MAIN.USER.FILE$ : _
  2928.          USER.FILE.INDEX = MAIN.USER.FILE.INDEX : _
  2929.          GOSUB 9400 : _
  2930.          GET 2,USER.FILE.INDEX : _
  2931.          GOSUB 9500
  2932. 10600 SYSOP = FALSE
  2933.       GOSUB 12989
  2934.       GOSUB 9400
  2935. 10601 GET 2,USER.FILE.INDEX
  2936.       GOSUB 9600
  2937.       IF LIST.DIRECTORY THEN _
  2938.          LSET LIST.NEW.DATE$ = CHR$(VAL(MID$(CURRENT.DATE$,7,2)))+_
  2939.                                CHR$(VAL(MID$(CURRENT.DATE$,1,2)))+_
  2940.                                CHR$(VAL(MID$(CURRENT.DATE$,4,2)))
  2941. 10605 LSET USER.DOWNLOADS$ = MKI$(DOWNLOADS)
  2942.       LSET USER.UPLOADS$ = MKI$(UPLOADS)
  2943.       GOSUB 41010
  2944.       LSET ELAPSED.TIME$ = MKI$(ELAPSED.TIME + _
  2945.                          (SECONDS.PER.SESSION! / 60) - _
  2946.                           TIME.REMAINING!)
  2947.       PUT 2,USER.FILE.INDEX
  2948.       GOTO 13540
  2949. 10620 Z$ = LG$(LOGON.ERROR.INDEX)
  2950.       SUBROUTINE.PARAMETER = 2
  2951.       CALL UPDTCALR
  2952.       Z$ = ACTIVE.USER.NAME$ + _
  2953.            " on at " + _
  2954.            CURRENT.DATE$ + _
  2955.            ", " + _
  2956.            TIM$ + _
  2957.            "** LOGON DENIED **, " + _
  2958.            BAUD.PARITY$
  2959.       NG$ = Z$ + SPACE$(128-LEN(Z$))
  2960. 10698 A$ = "Access denied!"
  2961.       GOSUB 12976
  2962.       IF BPS = -1 THEN _
  2963.          SUBROUTINE.PARAMETER = 1 : _
  2964.          CALL DELAYIT
  2965.       GOTO 13540
  2966. '
  2967. ' *****************************************************************************
  2968. ' *  SCAN FILE DIRECTORIES FOR DIRECTORY FILENAMES                            *
  2969. ' *****************************************************************************
  2970. '
  2971. 10720 CLS
  2972. 10721 FILES B$(J)
  2973.       X = CSRLIN
  2974.       LOCATE 2,1,1
  2975.       MAIN.DIRECTORY$ = DIRECTORY.EXTENTION$
  2976.       FOR I = 2 TO X
  2977.         FOR B = 1 TO 66 STEP 18
  2978.           G = G + 1
  2979.           B$(G) = ""
  2980.           FOR QQ = 0 TO 7
  2981.             H = SCREEN (I,(B + QQ))
  2982.             B$(G) = B$(G) + CHR$(H)
  2983.           NEXT
  2984.           IF LEFT$(B$(G),1) = " " THEN _
  2985.              G = G-1 : _
  2986.              RETURN
  2987.           WHILE RIGHT$(B$(G),1) = " "
  2988.                 B$(G) = LEFT$(B$(G),LEN(B$(G))-1)
  2989.           WEND
  2990. 10733     IF LIST.NEW THEN _
  2991.              IF (OMIT.MAIN.DIRECTORY$ = "YES" AND B$(G) = MAIN.DIRECTORY$) OR _
  2992.                 (OMIT.UPLOAD.DIRECTORY$ = "YES" AND B$(G) = UPLOAD.DIR.CHECK$) THEN _
  2993.                     G = G-1 : _
  2994.                     GOTO 10840
  2995. 10840   NEXT
  2996.       NEXT
  2997.       RETURN
  2998. '
  2999. ' *****************************************************************************
  3000. ' *  M - COMMAND FROM UTILITY MENU (CHANGE MARGINS)                           *
  3001. ' *****************************************************************************
  3002. '
  3003. 10925 UTILITY.MARGIN.CHANGE = TRUE
  3004.       GOSUB 3100
  3005.       UTILITY.MARGIN.CHANGE = FALSE
  3006.       RETURN
  3007. '
  3008. ' *****************************************************************************
  3009. ' *  7 - COMMAND FROM SYSOP MENU (EXIT TO DOS)                                *
  3010. ' *****************************************************************************
  3011. '
  3012. 10930 IF DOS.VERSION < 2 OR REQUIRED.RINGS = 0 THEN _
  3013.          A$ = "Remote exit to DOS not available." : _
  3014.          GOTO 1200
  3015. 10932 IF LOCAL.USER THEN _
  3016.          A$ = "Only for remote SYSOP's" : _
  3017.          GOTO 1200
  3018. 10934 CLOSE 2
  3019.       OPEN "O",2,RCTTY.BAT$
  3020.       PRINT #2,"ECHO OFF"
  3021.       PRINT #2,"CTTY ";COM.PORT$
  3022.       PRINT #2,"ECHO RBBS-PC ";VERSION.ID$
  3023.       PRINT #2,"ECHO SYSOP in Remote Console Mode at "; TIME$ ;" on "; DATE$
  3024.       PRINT #2,DISK.FOR.DOS$;"COMMAND "
  3025.       PRINT #2,"CTTY CON"
  3026.       PRINT #2,RBBS.BAT$
  3027. 10950 SUBROUTINE.PARAMETER = 1
  3028.       CALL AMORPM
  3029.       Z$ = "Exited to DOS at " + TIM$
  3030.       SUBROUTINE.PARAMETER = 2
  3031.       CALL UPDTCALR
  3032.       GOTO 10992
  3033. '
  3034. ' *****************************************************************************
  3035. ' *  D - COMMAND FROM MAIN MENU (EXIT TO DOORS)                               *
  3036. ' *****************************************************************************
  3037. '
  3038. 10970 IF NOT DOORS.AVAILABLE OR REQUIRED.RINGS = 0 THEN _
  3039.          A$ = "All doors are locked!" : _
  3040.          GOSUB 12979 : _
  3041.          GOTO 20095
  3042. 10973 FILE.NAME$ = MENU$(5)
  3043.       GOSUB 43025
  3044.       IF USER.SECURITY.LEVEL < DOORS.SECURITY.LEVEL THEN _
  3045.          A$ = "You do not have a key for my doors!" : _
  3046.          GOSUB 12979 : _
  3047.          RETURN
  3048. 10974 A$ = "Open which door (Press [ENTER] to quit)"
  3049.       GOSUB 12995
  3050.       IF Q = 0 THEN _
  3051.          RETURN
  3052.       CALL ALLCAPS (B$(1))
  3053.       Z$ = B$(1)
  3054. 10976 CALL OPENWORK
  3055. 10978 IF EOF(2) THEN _
  3056.          A$ = "No such door " + Z$ : _
  3057.          GOSUB 12979 : _
  3058.          GOTO 1200
  3059.       CALL CARRIER
  3060.       IF SUBROUTINE.PARAMETER = -1 THEN _
  3061.          GOTO 10595
  3062. 10982 LINE INPUT #2,A$
  3063.       IF LEN(A$) < LEN(Z$) THEN _
  3064.          GOTO 10978
  3065.       IF INSTR(A$,Z$) = 0 THEN _
  3066.          GOTO 10978
  3067.       Z$ = Z$ + ".BAT"
  3068. 10986 FILE.NAME$ = Z$
  3069.       CALL FINDIT
  3070.       IF OK THEN _
  3071.          GOTO 10987
  3072.       A$ = "Door " + Z$ + " closed" + ". Please tell SYSOP"
  3073.       GOSUB 12979
  3074.       GOTO 10970
  3075. 10987 CLOSE 2
  3076.       OPEN "O",2,RCTTY.BAT$
  3077.       PRINT #2,Z$
  3078.       PRINT #2,RBBS.BAT$
  3079.       CLOSE 2
  3080.       A$ = Z$ + " door opened at " + TIME$ + " on " + DATE$
  3081.       GOSUB 12979
  3082.       EXIT.TO.DOORS = TRUE
  3083.       Z$ = LEFT$(Z$,LEN(Z$)-4) + " door opened!"
  3084.       SUBROUTINE.PARAMETER = 2
  3085.       CALL UPDTCALR
  3086. 10992 CLOSE 3
  3087.       OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1
  3088.       IF EXIT.TO.DOORS THEN _
  3089.          IF MULTI.LINK.PRESENT AND _
  3090.             DOORS.TERMINAL.TYPE = > 1 THEN _
  3091.             DEF SEG = MULTI.LINK.PRESENT : _
  3092.             GOSUB 60500 : _
  3093.             POKE (&H64 + PEEK(&H58) + 256*PEEK(&H59) + &HC),ASC(RIGHT$(COM.PORT$,1))-48 : _
  3094.             AX = &H700 + DOORS.TERMINAL.TYPE : _
  3095.             GOSUB 60510 : _
  3096.             AX = &HB01 : _
  3097.             BX = 0 : _
  3098.             GOSUB 60510
  3099. 10996 GOSUB 9140
  3100.       GOSUB 43050
  3101.       RUN "EXITRBBS.EXE"
  3102. '
  3103. ' *****************************************************************************
  3104. ' *  5 - COMMAND FROM SYSOP MENU (USER FILE MAINTENANCE)                      *
  3105. ' *****************************************************************************
  3106. '
  3107. 11000 TU = USER.FILE.INDEX
  3108.       STOP.INTERRUPTS = TRUE
  3109.       I = 1
  3110.       SCAN.USERS = FALSE
  3111.       A$ = "A)dd, L)st, P)rt, M)od, S)can users (Press [ENTER] to quit)"
  3112.       GOSUB 12995
  3113. 11003 IF Q = 0 THEN _
  3114.          GOTO 20093
  3115.       QQ = 0
  3116.       Z$ = LEFT$(B$(1),1)
  3117.       CALL ALLCAPS (Z$)
  3118.       IF Z$ = "A" THEN _
  3119.          GOTO 12300 _
  3120.       ELSE IF Z$ = "M" THEN _
  3121.               STOP.INTERRUPTS = FALSE _
  3122.            ELSE IF Z$ = "P" THEN _
  3123.                    QQ = TRUE _
  3124.                 ELSE IF Z$ = "S" THEN _
  3125.                         SCAN.USERS = TRUE : _
  3126.                         STOP.INTERRUPTS = FALSE _
  3127.                      ELSE IF Z$ <> "L" THEN _
  3128.                              GOTO 11000
  3129. 11005 GOSUB 9400
  3130.       Z = 1
  3131.       IF SCAN.USERS THEN _
  3132.          A$ = "Scan for N)ame, P)wd, C)ity/St, S)ystem or L)evel" : _
  3133.          GOSUB 12995 : _
  3134.          SCAN.FUNCTION$ = LEFT$(B$(1),1) : _
  3135.          CALL ALLCAPS (SCAN.FUNCTION$) : _
  3136.          CR = 0 : _
  3137.          GOSUB 12979 : _
  3138.          GOSUB 12966 : _
  3139.       GOTO 12962
  3140. 11010 FOR J = Z TO HIGHEST.USER.RECORD-1
  3141.         GET 2,J
  3142. 11015   IF ASC(USER.NAME$) = 0 OR LEFT$(USER.NAME$,3) = "   " THEN _
  3143.            GOTO 11300
  3144.         OF = CVI(SECURITY.LEVEL$)
  3145.         A$ = RIGHT$("     "+STR$(LOC(2)),4) + _
  3146.              ":" + _
  3147.              USER.NAME$ + _
  3148.              "SECURITY" + _
  3149.              RIGHT$("     "+STR$(OF),5) + _
  3150.              " "
  3151. 11020   A$ = A$ + _
  3152.              "Password = " + _
  3153.              PASSWORD$
  3154. 11025   IF QQ THEN _
  3155.            Z$ = A$ : _
  3156.            CALL PRINTIT
  3157. 11027   GOSUB 12979
  3158.         RH = RET
  3159.         IF OF < MINIMUM.LOGON.SECURITY THEN _
  3160.            A$ = "     <Locked out>  " : _
  3161.            GOTO 11030
  3162.         IF OF >= SYSOP.SECURITY.LEVEL THEN _
  3163.            A$ = "     (SYSOP)       " : _
  3164.            GOTO 11030
  3165.         A$ = SPACE$(19)
  3166. 11030   A$ = A$ + _
  3167.              LAST.DATE.TIME.ON$ + _
  3168.              "   " + _
  3169.              CITY.STATE$ + _
  3170.              MACHINE.TYPE$
  3171. 11100   IF QQ THEN _
  3172.            Z$ = A$ : _
  3173.            CALL PRINTIT
  3174. 11101   GOSUB 12979
  3175.         RH = RET
  3176.         A$ = "  DOWNLOADS = " + _
  3177.              RIGHT$("     "+STR$(CVI(USER.DOWNLOADS$)),5)
  3178.         A$ = A$ + SPACE$(22-LEN(A$)) + _
  3179.              "UPLOADS = " + _
  3180.              RIGHT$("     "+STR$(CVI(USER.UPLOADS$)),5)
  3181.         A$ = A$ + SPACE$(40-LEN(A$)) + _
  3182.              " Times on =" +  _
  3183.              RIGHT$("     "+STR$(CVI(MID$(USER.OPTIONS$,1,2))),5)
  3184.         A$ = A$ + SPACE$(59-LEN(A$)) + _
  3185.              "TIME USED = " + _
  3186.              RIGHT$("     "+STR$(CVI(ELAPSED.TIME$)),5) + _
  3187.              " Min"
  3188.         IF QQ THEN _
  3189.            Z$ = A$ : _
  3190.            CALL PRINTIT
  3191. 11105   GOSUB 12979
  3192.         IF STOP.INTERRUPTS THEN _
  3193.            GOTO 11300
  3194. 11110   A$ = "D)elete,    F)ind,    M)enu,    N)ew pwd,    P)rint,"
  3195.         GOSUB 12979
  3196.         A$ = "R)eset graphics,      Q)uit,    S)ecurity,   #)user"
  3197.         GOSUB 12995
  3198.         IF NOT SCAN.USERS AND Q = 0 THEN _
  3199.            GOTO 11310
  3200. 11115   Z$ = LEFT$(B$(1),1)
  3201.         CALL ALLCAPS (Z$)
  3202.         X = INSTR("DNPQFSMR",Z$)
  3203.         IF Z$ = "" AND SCAN.USERS THEN _
  3204.            GOTO 12965
  3205.         ON X GOTO 11130,11160,11220,11320,11340,11390,11330,11400
  3206. 11125   Z = VAL(B$)
  3207.         IF Z < 1 OR Z > HIGHEST.USER.RECORD-1 THEN _
  3208.            GOTO 11310 _
  3209.         ELSE GOTO 11010
  3210. '
  3211. ' *****************************************************************************
  3212. ' *  D - COMMAND FROM 5- USER MAINTENANCE OPTIONS (DELETE USER)               *
  3213. ' *****************************************************************************
  3214. '
  3215. 11130   A$ = "Delete user (Y/N)"
  3216.         SUBROUTINE.PARAMETER = 1
  3217.         CALL TGET
  3218.         IF NO THEN _
  3219.            GOTO 11290
  3220.         LSET USER.NAME$ = "deleted user"
  3221.         LSET SECURITY.LEVEL$ = MKI$(MINIMUM.LOGON.SECURITY -1)
  3222.         LSET LAST.DATE.TIME.ON$ = "01/01/80" + " " + TIME.LOGGED.ON$
  3223.         GOTO 11290
  3224. '
  3225. ' *****************************************************************************
  3226. ' *  N - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER PASSWORD)      *
  3227. ' *****************************************************************************
  3228. '
  3229. 11160   GOSUB 12800
  3230.         GOTO 11290
  3231. '
  3232. ' *****************************************************************************
  3233. ' *  P - COMMAND FROM 5- USER MAINTENANCE OPTIONS (PRINT USER FILE)           *
  3234. ' *****************************************************************************
  3235. '
  3236. 11220   QQ = NOT QQ
  3237.         GOTO 11015
  3238. 11290   USER.FILE.INDEX = LOC(2)
  3239.         GOSUB 12989
  3240.         PUT 2,USER.FILE.INDEX
  3241.         GOSUB 12991
  3242.         USER.FILE.INDEX = 0
  3243.         GOTO 11015
  3244. 11300   IF RH THEN _
  3245.            GOTO 11330
  3246. 11310   IF SCAN.USERS THEN _
  3247.            GOTO 12965
  3248. 11311 NEXT
  3249. '
  3250. ' *****************************************************************************
  3251. ' *  Q - COMMAND FROM 5- USER MAINTENANCE OPTIONS (QUIT TO MAIN MENU)         *
  3252. ' *****************************************************************************
  3253. '
  3254. 11320 CLOSE 2
  3255.       USER.FILE.INDEX = TU
  3256.       GOTO 20095
  3257. '
  3258. ' *****************************************************************************
  3259. ' *  M - COMMAND FROM 5- USER MAINTENANCE OPTIONS (MAIN USER MAINT. MENU)     *
  3260. ' *****************************************************************************
  3261. '
  3262. 11330 CLOSE 2
  3263.       GOTO 11000
  3264. '
  3265. ' *****************************************************************************
  3266. ' *  F - COMMAND FROM 5- USER MAINTENANCE OPTIONS (FIND USER)                 *
  3267. ' *****************************************************************************
  3268. '
  3269. 11340 A$ = "Full name to find"
  3270.       CALL SKIPLINE
  3271.       GOSUB 12995
  3272.       IF Q = 0 THEN _
  3273.          GOTO 11340
  3274.       CALL ALLCAPS (B$(1))
  3275.       TEMP.USER.NAME$ = B$(1)
  3276.       IF LEN(TEMP.USER.NAME$) < 6 THEN _
  3277.          GOTO 11340
  3278.       GOSUB 12600
  3279.       GOSUB 12984
  3280.       USER.FILE.INDEX = 0
  3281.      IF FOUND THEN _
  3282.          GOTO 11015
  3283. 11380 A$ = TEMP.USER.NAME$ + " not found"
  3284.       GOSUB 12977
  3285.       GOTO 11310
  3286. '
  3287. ' *****************************************************************************
  3288. ' *  S - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER SECURITY)      *
  3289. ' *****************************************************************************
  3290. '
  3291. 11390 GOSUB 11395
  3292.       LSET SECURITY.LEVEL$ = MKI$(OF)
  3293.       GOTO 11290
  3294. 11395 A$ = "Enter security level"
  3295.       GOSUB 12995
  3296.       CALL ALLCAPS (B$(1))
  3297.       Z$ = B$(1)
  3298.       OF = VAL(Z$)
  3299.       IF OF > USER.SECURITY.LEVEL THEN _
  3300.          OF = USER.SECURITY.LEVEL
  3301.       RETURN
  3302. '
  3303. ' *****************************************************************************
  3304. ' *  R - COMMAND FROM 5- USER MAINTENANCE OPTIONS (RESET USER GRAPHICS)       *
  3305. ' *****************************************************************************
  3306. '
  3307. 11400 LSET USER.OPTIONS$ = LEFT$(USER.OPTIONS$,5) + _
  3308.                            "0" + _
  3309.                            MID$(USER.OPTIONS$,7)
  3310.       GOTO 11290
  3311. '
  3312. ' *****************************************************************************
  3313. ' *  A - COMMAND FROM 5- USER MAINTENANCE OPTIONS (ADD USER)                  *
  3314. ' *****************************************************************************
  3315. '
  3316. 12300 A1$ = ""
  3317.       ATTEMPTS = 0
  3318.       USER.SECURITY.LEVEL.SAVE = USER.SECURITY.LEVEL
  3319.       FIRST.NAME.SAVE$ = FIRST.NAME$
  3320.       LAST.NAME.SAVE$ = LAST.NAME$
  3321.       ACTIVE.USER.NAME.SAVE$ = ACTIVE.USER.NAME$
  3322.       CITY.STATE.SAVE$ = CI$
  3323.       GOSUB 12500
  3324.       TEMP.USER.NAME$ = ACTIVE.USER.NAME$
  3325.       GOSUB 12600
  3326.       IF USER.FILE.INDEX = 0 THEN _
  3327.          GOSUB 12984 : _
  3328.          GOTO 12330
  3329.       IF FOUND THEN _
  3330.          PRINT "User already exists" : _
  3331.          GOSUB 12984 : _
  3332.          GOTO 12330
  3333. 12310 GOSUB 12630
  3334.       GOSUB 12800
  3335.       GOSUB 11395
  3336.       TEMP.SECURITY.LEVEL = OF
  3337.       GOSUB 12900
  3338.       LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  3339.                                 " " + _
  3340.                                 TIME.LOGGED.ON$
  3341.       GOSUB 12950
  3342.       CALL ALLCAPS (B$(1))
  3343.       LSET CITY.STATE$ = B$(1)
  3344.       LSET ELAPSED.TIME$ = MKI$(0)
  3345.       PUT 2,USER.FILE.INDEX
  3346. 12320 GOSUB 12991
  3347. 12330 USER.SECURITY.LEVEL = USER.SECURITY.LEVEL.SAVE
  3348.       FIRST.NAME$ = FIRST.NAME.SAVE$
  3349.       LAST.NAME$ = LAST.NAME.SAVE$
  3350.       ACTIVE.USER.NAME$ = ACTIVE.USER.NAME.SAVE$
  3351.       CI$ = CITY.STATE.SAVE$
  3352.       USER.FILE.INDEX = TU
  3353.       GOTO 11000
  3354. '
  3355. ' *****************************************************************************
  3356. ' *  GET USER FIRST AND LAST NAMES                                            *
  3357. ' *****************************************************************************
  3358. '
  3359. 12500 IF ATTEMPTS > 5 THEN _
  3360.          FF = TRUE : _
  3361.          RETURN
  3362. 12510 GOSUB 12700
  3363.       ATTEMPTS = ATTEMPTS + 1
  3364.       A$ = A1$ + "FIRST Name"
  3365.       CALL SKIPLINE
  3366.       GOSUB 12995
  3367.       IF Q = 0 THEN _
  3368.          GOTO 12500
  3369.       CALL ALLCAPS (B$(1))
  3370.       Z$ = B$(1)
  3371.       GOSUB 5100
  3372.       FIRST.NAME$ = LEFT$(Z$ + SPACE$(2),INSTR(Z$ +SPACE$(2),SPACE$(2))-1)
  3373.       IF Q = 1 THEN _
  3374.          GOTO 12530
  3375. 12520 CALL ALLCAPS (B$(2))
  3376.       Z$ = B$(2)
  3377.       GOTO 12540
  3378. 12530 A$ = A1$ + "LAST Name"
  3379.       GOSUB 12995
  3380.       CALL ALLCAPS (B$(1))
  3381.       Z$ = B$(1)
  3382. 12540 GOSUB 5100
  3383.       LAST.NAME$ =LEFT$(Z$ + SPACE$(2),INSTR(Z$ +SPACE$(2),SPACE$(2))-1)
  3384.       IF LEN(FIRST.NAME$) < 2 OR _
  3385.          LEN(LAST.NAME$) < 2 OR _
  3386.          (LEN(FIRST.NAME$) + LEN(LAST.NAME$)) > 30 THEN _
  3387.          GOTO 12500
  3388. 12550 ACTIVE.USER.NAME$ = MID$(FIRST.NAME$ + " " + LAST.NAME$,1,31)
  3389.       Z$ = FIRST.NAME$
  3390.       RETURN
  3391. '
  3392. ' *****************************************************************************
  3393. ' *  CHECK FOR NAMES NOT ALLOWED                                              *
  3394. ' *****************************************************************************
  3395. '
  3396. 12570 FOUND = FALSE
  3397.       SWAP TRASHCAN.FILE$,FILE.NAME$
  3398.       CALL OPENWORK
  3399.       SWAP TRASHCAN.FILE$,FILE.NAME$
  3400.       IF EC = 53 THEN _
  3401.          GOTO 710
  3402. 12580 IF EOF(2) THEN _
  3403.          RETURN
  3404.       INPUT #2,INVALID.NAME$
  3405.       IF Z$ <> INVALID.NAME$ THEN _
  3406.          GOTO 12580
  3407.       FOUND = TRUE
  3408.       RETURN
  3409. 12595 A$ = "Real name required.  Call traced & recorded."
  3410.       GOSUB 12979
  3411.       GOTO 10698
  3412. '
  3413. ' *****************************************************************************
  3414. ' *  COMMON SEARCH USER FILE ROUTINE                                          *
  3415. ' *****************************************************************************
  3416. '
  3417. 12600 GOSUB 4910
  3418.       GOSUB 12988
  3419.       A$ = "Checking Users..."
  3420.       GOSUB 12977
  3421. 12605 GOSUB 9400
  3422.       X$ = TEMP.USER.NAME$ + SPACE$(31-LEN(TEMP.USER.NAME$))
  3423.       DF = (ASC(MID$(TEMP.USER.NAME$,2,1))*10  + 7) MOD _
  3424.            HIGHEST.USER.RECORD
  3425.       USER.FILE.INDEX = _
  3426.            ((ASC(TEMP.USER.NAME$)*100  + _
  3427.              ASC(MID$(TEMP.USER.NAME$,LEN(TEMP.USER.NAME$) / 2,1)) * _
  3428.              10  + _
  3429.              ASC(RIGHT$(TEMP.USER.NAME$,1))) _
  3430.              MOD HIGHEST.USER.RECORD) + 1
  3431.       IX = 0
  3432. 12610 GET 2,USER.FILE.INDEX
  3433.       IF X$ = USER.NAME$ THEN _
  3434.          FOUND = TRUE : _
  3435.          RETURN
  3436.       IF USER.NAME$ = SPACE$(31) THEN _
  3437.          IF CURRENT.USER.COUNT >= HIGHEST.USER.RECORD*.95 THEN _
  3438.             Z$ = "No room for new users" + GRN$ : _
  3439.             A$ = Z$ : _
  3440.             SUBROUTINE.PARAMETER = 2 : _
  3441.             CALL UPDTCALR : _
  3442.             GOSUB 1397 : _
  3443.             USER.FILE.INDEX = 0 : _
  3444.             FOUND = FALSE : _
  3445.             RETURN _
  3446.          ELSE USER.FILE.INDEX = IX-(IX = 0)*USER.FILE.INDEX : _
  3447.               FOUND = FALSE : _
  3448.               RETURN
  3449.       IF ASC(USER.NAME$) = 0 OR LEFT$(USER.NAME$,7) = "NEWUSER" THEN _
  3450.          IF IX = 0 THEN _
  3451.             IX = USER.FILE.INDEX
  3452. 12620 USER.FILE.INDEX = USER.FILE.INDEX + DF
  3453.       IF USER.FILE.INDEX > HIGHEST.USER.RECORD-1 THEN _
  3454.          USER.FILE.INDEX = USER.FILE.INDEX-HIGHEST.USER.RECORD
  3455.       GOTO 12610
  3456. 12630 GOSUB 23000
  3457.       CURRENT.USER.COUNT = CURRENT.USER.COUNT-(IX = 0)
  3458.       GOSUB 24000
  3459.       GOSUB 12987
  3460.       GOSUB 12989
  3461.       GOSUB 12990
  3462.       RETURN
  3463. '
  3464. ' *****************************************************************************
  3465. ' *  INFORM USER OF WHAT CONFERENCE USER FILE HE IS VIEWING                   *
  3466. ' *****************************************************************************
  3467. '
  3468. 12700 IF CONFERENCE.MODE THEN _
  3469.          A$ = "Users of " + GRN$ + ":" : _
  3470.          GOSUB 12979
  3471.       RETURN
  3472. '
  3473. ' *****************************************************************************
  3474. ' *  GET PASSWORD FROM NEWUSER                                                *
  3475. ' *****************************************************************************
  3476. '
  3477. 12800 A$ = "Enter PASSWORD you'll use to logon again"
  3478.       GOSUB 12995
  3479.       IF B$(1) = SPACE$(LEN(B$(1))) THEN _
  3480.          GOTO 12800
  3481.       IF LEN(B$(1)) > 15 THEN _
  3482.          A$ = "15 Char. Max" : _
  3483.          GOSUB 12979 : _
  3484.          GOTO 12800
  3485.       CALL ALLCAPS (B$(1))
  3486.       Z$ = B$(1)
  3487.       LSET PASSWORD$ = Z$
  3488.       RETURN
  3489. '
  3490. ' *****************************************************************************
  3491. ' *  SET NEWUSER DEFAULTS                                                     *
  3492. ' *****************************************************************************
  3493. '
  3494. 12900 LSET USER.NAME$ = ACTIVE.USER.NAME$
  3495.       LSET USER.OPTIONS$ = MKI$(0) + _
  3496.                            MKI$(0) + _
  3497.                            " 0" + _
  3498.                            MKI$(64) + _
  3499.                            MKI$(16) + _
  3500.                            MKI$(0) + _
  3501.                            CHR$(PAGE.LENGTH) + _
  3502.                            STRING$(1,0)
  3503.       LSET USER.DOWNLOADS$ = MKI$(0)
  3504.       LSET USER.UPLOADS$ = MKI$(0)
  3505.       LSET SECURITY.LEVEL$ = MKI$(TEMP.SECURITY.LEVEL)
  3506.       LSET ELAPSED.TIME$ = MKI$(0)
  3507.       RETURN
  3508. '
  3509. ' *****************************************************************************
  3510. ' *  GET MACHINE TYPE CALLING FROM                                            *
  3511. ' *****************************************************************************
  3512. '
  3513. 12950 A$ = "What type of system are you calling from (Press [ENTER] if " + _
  3514.            DEFAULT.MACHINE.TYPE$ + _
  3515.            ")"
  3516.       GOSUB 12995
  3517.       IF Q = 0 THEN _
  3518.          LSET MACHINE.TYPE$ = DEFAULT.MACHINE.TYPE$ _
  3519.       ELSE CALL ALLCAPS (B$(1)) : _
  3520.       LSET MACHINE.TYPE$ = B$(1)
  3521. '
  3522. ' *****************************************************************************
  3523. ' *  GET CITY AND STATE FROM NEWUSER                                          *
  3524. ' *****************************************************************************
  3525. '
  3526. 12960 A$ = A1$ + "CITY and STATE"
  3527.       GOSUB 12995
  3528.       IF Q = 0 THEN _
  3529.          GOTO 12960
  3530.       CALL ALLCAPS (B$(1))
  3531.       LSET CITY.STATE$ = B$(1)
  3532.       CI$ = B$(1) + SPACE$(2)
  3533.       RETURN
  3534. '
  3535. ' *****************************************************************************
  3536. ' *  S - COMMAND FROM 5 - USER MAINTENANCE OPTIONS (SCAN USERS)               *
  3537. ' *****************************************************************************
  3538. '
  3539. 12962 X = 0
  3540.       FF = FALSE
  3541.       A$ = "String to search (Press [ENTER] to quit)"
  3542.       GOSUB 12995
  3543.       IF Q = 0 THEN _
  3544.          GOTO 11000
  3545.       CALL ALLCAPS (B$(1))
  3546.       R$ = B$(1)
  3547. 12963 GET 2,I
  3548.       GOSUB 12966
  3549.       X = INSTR(SCAN.FIELD$,R$)
  3550.       IF X > 0 THEN _
  3551.          GOTO 11015
  3552. 12965 I = I + 1
  3553.       IF I > HIGHEST.USER.RECORD-1 THEN _
  3554.          GOTO 11000
  3555.       X = 0
  3556.       GOTO 12963
  3557. 12966 FF = INSTR("NCPSL",SCAN.FUNCTION$)
  3558.       IF FF = 0 THEN _
  3559.          GOTO 11000
  3560. 12967 ON FF GOTO 12968,12969,12970,12971,12972
  3561. '
  3562. ' *****************************************************************************
  3563. ' *  N - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR NAME)    *
  3564. ' *****************************************************************************
  3565. '
  3566. 12968 SCAN.FIELD$ = USER.NAME$
  3567.       RETURN
  3568. '
  3569. ' *****************************************************************************
  3570. ' *  C - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR CITY/ST) *
  3571. ' *****************************************************************************
  3572. '
  3573. 12969 SCAN.FIELD$ = CITY.STATE$
  3574.       RETURN
  3575. '
  3576. ' *****************************************************************************
  3577. ' *  P - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR PASSWORD)*
  3578. ' *****************************************************************************
  3579. '
  3580. 12970 SCAN.FIELD$ = PASSWORD$
  3581.       RETURN
  3582. '
  3583. ' *****************************************************************************
  3584. ' *  S - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR SYSTEM)  *
  3585. ' *****************************************************************************
  3586. '
  3587. 12971 SCAN.FIELD$ = MACHINE.TYPE$
  3588.       RETURN
  3589. '
  3590. ' *****************************************************************************
  3591. ' *  L - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR LEVEL)   *
  3592. ' *****************************************************************************
  3593. '
  3594. 12972 SCAN.FIELD$ = STR$(CVI(SECURITY.LEVEL$))
  3595.       RETURN
  3596. '
  3597. ' *****************************************************************************
  3598. ' * CALLS INTO SEPEARATELY COMPILED SUBROUTINES (RBBS-SUB)                    *
  3599. ' *****************************************************************************
  3600. '
  3601. '
  3602. ' *****************************************************************************
  3603. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL OUTPUT ROUTINE               *
  3604. ' *****************************************************************************
  3605. '
  3606. 12975 SUBROUTINE.PARAMETER = 1
  3607.       GOTO 12981
  3608. 12976 SUBROUTINE.PARAMETER = 2
  3609.       GOTO 12981
  3610. 12977 SUBROUTINE.PARAMETER = 3
  3611.       GOTO 12981
  3612. 12978 SUBROUTINE.PARAMETER = 4
  3613.       GOTO 12981
  3614. 12979 SUBROUTINE.PARAMETER = 5
  3615.       GOTO 12981
  3616. 12980 SUBROUTINE.PARAMETER = 6
  3617. 12981 CALL TPUT
  3618. 12983 IF SUBROUTINE.PARAMETER = -1 THEN _
  3619.          GOTO 10595
  3620.       IF FUNCTION.KEY <>0 THEN _
  3621.          GOSUB 60010 : _
  3622.          SUBROUTINE.PARAMETER = 7 : _
  3623.          FUNCTION.KEY = 0 : _
  3624.          GOTO 12981
  3625.       IF SUBROUTINE.PARAMETER = 8 THEN _
  3626.           GOSUB 12995
  3627.       RETURN
  3628. '
  3629. ' *****************************************************************************
  3630. ' * STANDARD ENTRY FOR RBBS-PC'S FILE LOCKING WHEN RUNNING MULTIPLE RBBS-PC'S *
  3631. ' *****************************************************************************
  3632. '
  3633. 12984 SUBROUTINE.PARAMETER = 1
  3634.       GOTO 12994
  3635. 12985 SUBROUTINE.PARAMETER = 2
  3636.       GOTO 12994
  3637. 12986 SUBROUTINE.PARAMETER = 3
  3638.       GOTO 12994
  3639. 12987 SUBROUTINE.PARAMETER = 4
  3640.       GOTO 12994
  3641. 12988 SUBROUTINE.PARAMETER = 5
  3642.       GOTO 12994
  3643. 12989 SUBROUTINE.PARAMETER = 6
  3644.       GOTO 12994
  3645. 12990 SUBROUTINE.PARAMETER = 7
  3646.       GOTO 12994
  3647. 12991 SUBROUTINE.PARAMETER = 8
  3648.       GOTO 12994
  3649. 12992 SUBROUTINE.PARAMETER = 9
  3650.       GOTO 12994
  3651. 12993 SUBROUTINE.PARAMETER = 10
  3652. 12994 CALL FILELOCK
  3653.       IF SUBROUTINE.PARAMETER = -1 THEN _
  3654.          GOTO 31000
  3655.       RETURN
  3656. '
  3657. ' *****************************************************************************
  3658. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL INPUT ROUTINE                *
  3659. ' *****************************************************************************
  3660. '
  3661. 12995 SUBROUTINE.PARAMETER = 1
  3662. 12996 CALL TGET
  3663. 12997 IF SUBROUTINE.PARAMETER = -1 THEN _
  3664.          GOTO 10595
  3665.       IF FUNCTION.KEY <>0 THEN _
  3666.          GOSUB 60010 : _
  3667.          SUBROUTINE.PARAMETER = 2 : _
  3668.          FUNCTION.KEY = 0 : _
  3669.          GOTO 12996
  3670.       RETURN
  3671. '
  3672. ' *****************************************************************************
  3673. ' *  MAIN SYSTEM ERROR TRAP - ALL ERRORS PASS THROUGH THIS ROUTINE            *
  3674. ' *****************************************************************************
  3675. '
  3676. 13000 ' PRINT ERR,ERL
  3677.       IF ERR = 0 AND ERL = 210 THEN _
  3678.          PRINT "Unrecoverable error on communications port" : _
  3679.          GOTO 31000
  3680.       IF ERR = 0 THEN _
  3681.          GOTO 13540
  3682.       IF ERR = 7 THEN _
  3683.          GOTO 13650
  3684. 13010 IF ERL = 130 THEN _
  3685.          CALLERS.FILE.INDEX = 1 : _
  3686.          RESUME 135
  3687. 13025 IF ERL = 677 AND ERR = 5 THEN _
  3688.          RESUME 670
  3689. 13033 IF ERL = 825 AND ERR = 5 THEN _
  3690.          RESUME 830
  3691. 13038 IF ERL = 4371 AND ERR = 6 THEN _
  3692.          RESUME 1200
  3693. 13045 IF ERL = 5130 AND ERR = 63 THEN _
  3694.          RESUME 5160
  3695. 13047 IF ERL = 5151 AND ERR = 62 THEN _
  3696.          RESUME 5160
  3697. 13050 IF ERL = 9400 AND ERR = 75 AND SHARE.IT THEN _
  3698.          SUBROUTINE.PARAMETER = 30 : _
  3699.          CALL DELAYIT : _
  3700.          RESUME 9400
  3701. 13060 IF ERL = 11025 THEN _
  3702.          QQ = 0 : _
  3703.          RESUME 11025
  3704. 13070 IF ERL = 11100 THEN _
  3705.          QQ = 0 : _
  3706.          RESUME 11100
  3707. 13075 IF ERL = 12610 AND ERR = 63 THEN _
  3708.          IF IX = 0 THEN _
  3709.             IX = USER.FILE.INDEX : _
  3710.             RESUME 12620 _
  3711.          ELSE RESUME 12620
  3712. 13087 IF ERL = 20242 AND ERR = 62 THEN _
  3713.          RESUME 20247
  3714. 13090 IF ERR = 58 THEN _
  3715.          GOTO 13190
  3716. 13100 CALL FINDTIME (TI!)
  3717.       IF (ERR = EC AND (TI! - TKA! < 5)) THEN _
  3718.          EA = EA + 1 : _
  3719.          IF EA > 10 THEN _
  3720.             GOTO 13800
  3721. 13120 EC = ERR
  3722.       CALL FINDTIME (TI!)
  3723.       IF TI! - TKA! > 5 THEN _
  3724.          EA = 0 _
  3725.       ELSE CALL FINDTIME(TKA!)
  3726. 13190 IF ERL = 3737 OR _
  3727.          ERL = 4797 OR _
  3728.          ERL = 20840 OR _
  3729.          ERL = 21281 OR _
  3730.          ERL = 21360 OR _
  3731.          ERL = 21420 THEN _
  3732.          SUBROUTINE.PARAMETER = 1 : _
  3733.          CALL DELAYIT : _
  3734.          IF INP(MODEM.STATUS.REGISTER) < 128 THEN _
  3735.             RESUME 10595
  3736. 13220 IF ERL = 3737 THEN _
  3737.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3738.          RESUME 3737
  3739. 13225 IF ERL = 4740 THEN _
  3740.          RESUME 4745
  3741. 13230 IF ERL = 4797 THEN _
  3742.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3743.          RESUME 4797
  3744. 13245 IF ERL = 5536 AND ERR = 57 THEN _
  3745.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3746.          RESUME 5530
  3747. 13250 IF ERL = 5536 THEN _
  3748.          RESUME 5530
  3749. 13260 IF ERL = 7110 THEN _
  3750.          RESUME 6080
  3751. 13270 IF ERL = 7130 AND ERR = 52 THEN _
  3752.          RESUME 7260
  3753. 13280 IF ERL = 10601 AND ERR = 63 THEN _
  3754.          GOTO 10595
  3755. 13310 IF ERL = 10721 THEN _
  3756.          IF ERR = 53 OR ERR = 64 OR ERR = 68 THEN _
  3757.             RESUME 5160
  3758.       IF ERL = 20290 AND ERR = 75 THEN _
  3759.          RESUME 20231
  3760. 13390 IF ERL = 20452 AND ERR = 53 THEN _
  3761.          RESUME 20451
  3762.       IF ERL = 20560 AND ERR = 67 THEN _
  3763.          RESUME 20451
  3764. 13395 IF ERL = 20560 AND ERR = 70 THEN _
  3765.          IF VAL(FREE.SPACE$) > 1999 THEN _
  3766.             RESUME 20451 ELSE _
  3767.          A$ = "No room for uploads!  Please try again tomorrow." : _
  3768.          GOSUB 12979 : _
  3769.          RESUME 5160
  3770. 13396 IF ERL = 20610 AND ERR = 57 THEN _
  3771.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3772.          RESUME 20610
  3773. 13400 IF ERL = 20620 THEN _
  3774.          RESUME 20670
  3775. 13405 IF ERL = 20736 AND ERR = 53 THEN _
  3776.          RESUME 5160
  3777. 13410 IF ERL = 20840 THEN _
  3778.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3779.          RESUME 20840
  3780. 13415 IF ERL = 20900 AND ERR = 70 THEN _
  3781.          A$ = "No room for uploads!  Please try again tomorrow." : _
  3782.          GOSUB 12979 : _
  3783.          RESUME 21230
  3784.       IF ERL = 20900 AND ERR = 75 THEN _
  3785.          RESUME 21230
  3786. 13420 IF ERL = 21131 THEN _
  3787.          RESUME 21230
  3788. 13430 IF ERL = 21281 THEN _
  3789.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3790.          RESUME 21281
  3791. 13440 IF ERL = 21360 THEN _
  3792.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3793.          RESUME 21360
  3794. 13442 IF ERL = 21420 THEN _
  3795.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3796.          RESUME 21420
  3797. 13450 IF 65535! = ERL THEN _
  3798.          GOTO 13800
  3799. 13460 IF ERR = 5 OR ERR = 6 THEN _
  3800.          GOTO 10595
  3801. 13470 IF ERR = 57 OR ERR = 24 OR ERR = 25 THEN _
  3802.          SUBROUTINE.PARAMETER = 1 : _
  3803.          CALL DELAYIT : _
  3804.          IF INP(MODEM.STATUS.REGISTER) < 128 THEN _
  3805.             RESUME 10595
  3806. 13480 IF ERR = 61 OR EC = 61 THEN _
  3807.          A$ = "* Disk full - terminating *" : _
  3808.          GOSUB 12976 : _
  3809.          GOSUB 33090 : _
  3810.          IF (ERR = 61 OR EC = 61) AND ERL <> 43050 THEN _
  3811.             CALL LOGERROR : _
  3812.             RESUME 13540 : _
  3813.          ELSE RESUME 13540
  3814. 13490 IF ERR = 71 THEN _
  3815.          GOSUB 13630 : _
  3816.          RESUME 20015
  3817. 13500 CALL LOGERROR
  3818.       A$ = A$ + ". Please tell SYSOP"
  3819.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  3820.          GOSUB 12979
  3821.       RESUME 1200
  3822. '
  3823. ' *****************************************************************************
  3824. ' * COMMON EXIT FROM RBBS-PC (I.E. "ABANDON ALL HOPE OH YE WHO ENTER HERE")   *
  3825. ' *****************************************************************************
  3826. '
  3827. 13540 IF LOCAL.USER THEN _
  3828.          GOTO 13549
  3829. 13543 IF NOT SYSOP THEN _
  3830.          IF USER.FILE.INDEX = 0 OR NEW.USER = TRUE THEN _
  3831.             GOTO 13549
  3832. 13545 GOSUB 43050
  3833. 13549 GOSUB 13700
  3834.       GOSUB 13550
  3835.       GOSUB 12986
  3836.       GOSUB 30500
  3837.       GET 1,NODE.RECORD.INDEX
  3838.       EXIT.TO.DOORS = FALSE
  3839.       MID$(MESSAGE.RECORD$,57,1) = "I"
  3840.       MID$(MESSAGE.RECORD$,40,2) = STR$(EXIT.TO.DOORS)
  3841.       PUT 1,NODE.RECORD.INDEX
  3842.       GOSUB 12985
  3843.       CLOSE
  3844.       SUBROUTINE.PARAMETER = 4
  3845.       CALL DELAYIT
  3846.       IF RECYCLE.TO.DOS THEN _
  3847.          GOTO 31000 _
  3848.       ELSE RUN 100
  3849. 13550 IF LOCAL.USER THEN _
  3850.          RETURN
  3851. 13560 SUBROUTINE.PARAMETER = 3
  3852.       CALL DELAYIT
  3853.       OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) AND 254
  3854.       SUBROUTINE.PARAMETER = 1
  3855.       CALL DELAYIT
  3856.       OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1
  3857.       RETURN
  3858. 13600 CLS
  3859.       LOCATE ,,0
  3860.       PRINT DF$;" file not found/invalid.  Run CONFIG."
  3861.       SUBROUTINE.PARAMETER = 3
  3862.       CALL DELAYIT
  3863.       GOTO 31000
  3864. 13630 A$ = "File Menu not available."
  3865.       GOSUB 12979
  3866.       RETURN
  3867. 13650 CLS
  3868.       LOCATE ,,0
  3869.       PRINT "Not enough memory for RBBS"
  3870.       SUBROUTINE.PARAMETER = 3
  3871.       CALL DELAYIT
  3872.       GOTO 31000
  3873. 13700 IF MESSAGE.FILE.LOCK THEN _
  3874.          GOSUB 12987
  3875. 13710 IF USER.FILE.LOCK THEN _
  3876.          GOSUB 12990
  3877. 13720 IF USER.BLOCK.LOCK THEN _
  3878.          GOSUB 12991
  3879.       RETURN
  3880. '
  3881. ' *****************************************************************************
  3882. ' *  FATAL ERROR HAS OCCURED!  RECYCLE SYSTEM IMMEDIATELY                     *
  3883. ' *****************************************************************************
  3884. '
  3885. 13800 A$ = "Fatal error!"
  3886.       GOSUB 12979
  3887.       GOTO 10595
  3888. '
  3889. ' *****************************************************************************
  3890. ' *         TAKE THE PHONE OFF THE HOOK FOR LOCAL SYSOP MAINTENANCE           *
  3891. ' *****************************************************************************
  3892. '
  3893. 14500 A$ = MODEM.GO.OFFHOOK.COMMAND$
  3894.       CALL MODEMPUT
  3895.       CLOSE 3
  3896.       RETURN
  3897. '
  3898. ' *****************************************************************************
  3899. ' *                                                                           *
  3900. ' *                          FILES MENU PROCESSING                            *
  3901. ' *                                                                           *
  3902. ' *****************************************************************************
  3903. '
  3904. 20015 SUBROUTINE.PARAMETER = 1
  3905.       CALL LINE25
  3906.       ACTIVE.MENU$ = "F"
  3907.       GOSUB 41050
  3908.       NON.STOP = FALSE
  3909.       IF NOT EXPERT.USER THEN _
  3910.          FILE.NAME$ = MENU$(3) : _
  3911.          GOSUB 43025
  3912. 20030 A$ = GRN$ + " File Function <D,G,H,L,N,Q,S,U,X,?>"
  3913.       CALL SKIPLINE
  3914.       GOSUB 12995
  3915.       IF Q = 0 THEN _
  3916.          GOTO 20015
  3917. 20050 LIST.NEW = FALSE
  3918.       CALL ALLCAPS (B$(1))
  3919.       Z$ = B$(1)
  3920.       FF = INSTR("DGHLNQSUX?",Z$)
  3921.       IF FF = 0 THEN _
  3922.          J = 1 : _
  3923.          GOSUB 1360 : _
  3924.          GOTO 20015
  3925.       IF USER.SECURITY.LEVEL < FILES.FUNCTION(FF) THEN _
  3926.          VIOLATION$ = "File " + Z$ : _
  3927.          GOSUB 1380 : _
  3928.          GOTO 20015
  3929. 20070 ON FF GOSUB 20180, _               ' D)ownload a file
  3930.                   20100, _               ' G)oodbye (log off)
  3931.                   20110, _               ' H)elp (on line)
  3932.                   20150, _               ' L)ist file directories
  3933.                   53000, _               ' N)ew file search since given date
  3934.                   20090, _               ' Q)uit and exit to message subsystem
  3935.                   52900, _               ' S)earch directories for a string
  3936.                   20400, _               ' U)pload a file
  3937.                   4240, _                ' X)Expert mode toggle on/off
  3938.                   20130                  ' ?)File transfer information
  3939.       GOTO 20015
  3940. '
  3941. ' *****************************************************************************
  3942. ' *  Q - COMMAND FROM FILES MENU (QUIT)                                       *
  3943. ' *****************************************************************************
  3944. '
  3945. 20090 RETURN 20095
  3946. '
  3947. ' *****************************************************************************
  3948. ' *  C/R - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (QUIT TO MAIN MENU)*
  3949. ' *****************************************************************************
  3950. '
  3951. 20093 IF USER.FILE.INDEX > 0 THEN _
  3952.          GOSUB 9400 : _
  3953.          GET 2,USER.FILE.INDEX : _
  3954.          GOSUB 9500
  3955. 20095 RETURN 1200
  3956. '
  3957. ' *****************************************************************************
  3958. ' *  G - COMMAND FROM FILES MENU (GOODBYE)                                    *
  3959. ' *****************************************************************************
  3960. '
  3961. 20100 RETURN 10560
  3962. '
  3963. ' *****************************************************************************
  3964. ' *  H - COMMAND FROM FILES MENU (HELP)                                       *
  3965. ' *****************************************************************************
  3966. '
  3967. 20110 FILE.NAME$ = HELP$(5)
  3968.       GOSUB 1790
  3969.       RETURN
  3970. '
  3971. ' *****************************************************************************
  3972. ' *  ? - COMMAND FROM FILES MENU (EXTRA HELP)                                 *
  3973. ' *****************************************************************************
  3974. '
  3975. 20130 FILE.NAME$ = HELP$(6)
  3976.       GOSUB 1790
  3977.       RETURN
  3978. '
  3979. ' *****************************************************************************
  3980. ' *  L - COMMAND FROM FILES MENU (LIST DIRECTORY)                             *
  3981. ' *****************************************************************************
  3982. '
  3983. 20150 LIST.DIRECTORY = TRUE
  3984.       IF Q < 2 THEN _
  3985.          Q = 2 : _
  3986.          B$(Q) = DIRECTORY.EXTENTION$
  3987. 20160 X = 2
  3988.       QX = Q
  3989. 20161 IF X > QX THEN _
  3990.          RETURN
  3991.       IF INSTR(B$(X),".") THEN _
  3992.          GOTO 20172
  3993.       VIOLATION$ = "List Dir. "
  3994.       Z$ = B$(X)
  3995.       CALL BADFILE
  3996.       ON BAD.FILE.NAME.INDEX GOTO 20162,20172,20176
  3997. 20162 FOR SUBDIR.INDEX = 1 TO SUBDIR.COUNT
  3998.         FILE.NAME$ = B$(X)
  3999.         CALL BADNAME
  4000.         ON BAD.FILE.NAME.INDEX GOTO 20164,20176
  4001. 20164   FILE.NAME$ = SUBDIR$(SUBDIR.INDEX)+ _
  4002.                      B$(X) + _
  4003.                      "." + _
  4004.                      DIRECTORY.EXTENTION$
  4005.         GOSUB 43030
  4006. 20165   CALL FINDIT
  4007.         IF OK THEN _
  4008.            GOTO 20167
  4009.         GOTO 20170
  4010. 20167   IF LIST.NEW THEN _
  4011.            GOSUB 7000 : _
  4012.            GOTO 20175
  4013.         GOSUB 6000
  4014.         GOTO 20175
  4015. 20170 NEXT
  4016. 20172 A$ = "Directory " + B$(X) + " not found!"
  4017.       GOSUB 12977
  4018. 20175 X = X + 1
  4019.       GOTO 20161
  4020. 20176 GOSUB 1380
  4021.       GOTO 20172
  4022. '
  4023. ' *****************************************************************************
  4024. ' *  D - COMMAND FROM FILES MENU (SEARCH FOR FILE TO DOWNLOAD)                *
  4025. ' *****************************************************************************
  4026. '
  4027. 20180 IF Q > 1 THEN _
  4028.          B = 2 : _
  4029.          GOTO 20202
  4030. 20200 A$ = "Enter full filename to download"
  4031.       GOSUB 12995
  4032.       B = 1
  4033.       IF Q = 0 THEN _
  4034.          RETURN
  4035. 20202 START.DRIVE = 1
  4036.       IF Q > B THEN _
  4037.          START.DRIVE = VAL(B$(B + 1)) : _
  4038.          IF START.DRIVE < 1 THEN _
  4039.             START.DRIVE = 1
  4040. 20205 Z$ = B$(B)
  4041.       VIOLATION$ = "Download "
  4042.       FOR SUBDIR.INDEX = START.DRIVE TO (SUBDIR.COUNT) + (NOT SYSOP)
  4043.         CALL BADFILE
  4044.         ON BAD.FILE.NAME.INDEX GOTO 20220,20231,20233
  4045. 20220   CALL FINDIT
  4046. 20225   IF OK THEN _
  4047.            GOTO 20235
  4048. 20230 NEXT
  4049. 20231 Z$ = B$(B) + " not found!"
  4050.       SUBROUTINE.PARAMETER = 2
  4051.       CALL UPDTCALR
  4052.       A$ = Z$ + " Type L for directory"
  4053.       GOSUB 12977
  4054.       RETURN 20015
  4055. 20233 GOSUB 1380
  4056.       GOTO 20231
  4057. 20235 CALL BADNAME
  4058.       ON BAD.FILE.NAME.INDEX GOTO  20236,20245
  4059. 20236 LINE.25$ = "(D) " + Z$
  4060. '
  4061. ' *****************************************************************************
  4062. ' *  TEST FOR DOWNLOAD SECURITY                                               *
  4063. ' *****************************************************************************
  4064. '
  4065.       SWAP FILESEC.FILE$,FILE.NAME$
  4066.       CALL OPENWORK
  4067.       SWAP FILESEC.FILE$,FILE.NAME$
  4068.       IF EC = 53 THEN _
  4069.          Z$ = "Missing file " + FILESEC.FILE$ : _
  4070.          SUBROUTINE.PARAMETER = 2 : _
  4071.          CALL UPDTCALR : _
  4072.          GOTO 20247
  4073.       N$ = Z$
  4074.       GOSUB 20282
  4075.       LG$(9) = DR$
  4076.       LG$(8) = X$
  4077.       LG$(10) = EXTENTION$
  4078. 20242 IF EOF(2) THEN _
  4079.          GOTO 20247 _
  4080.       ELSE INPUT #2,N$,FILE.SECURITY,FILE.PASSWORD$ : _
  4081.            GOSUB 20282
  4082. 20243 IF DR$ <> "" AND DR$ <> LG$(9) THEN _
  4083.          GOTO 20242
  4084.       A$ = LG$(8)
  4085.       Z$ = X$
  4086.       GOSUB 20285
  4087.       IF OK THEN _
  4088.          GOTO 20242
  4089.       A$ = LG$(10)
  4090.       Z$ = EXTENTION$
  4091.       GOSUB 20285
  4092.       IF OK THEN _
  4093.          GOTO 20242
  4094. 20244 IF USER.SECURITY.LEVEL < FILE.SECURITY THEN _
  4095.          GOTO 20245
  4096.       IF FILE.PASSWORD$ = "" THEN _
  4097.          GOTO 20247
  4098.       CALL ALLCAPS (FILE.PASSWORD$)
  4099.       IF FILE.PASSWORD$ = PASSWORD$ THEN _
  4100.          GOTO 20247
  4101.       A$ = "Enter PASSWORD for downloading " + FILE.NAME$
  4102.       GOSUB 12995
  4103.       IF Q = 0 THEN _
  4104.          RETURN 20015
  4105.       CALL ALLCAPS (B$(1))
  4106.       IF B$(1) = FILE.PASSWORD$ THEN _
  4107.          GOTO 20247
  4108. 20245 VIOLATION$ = "DownLoad " + FILE.NAME$
  4109. 20246 GOSUB 1380
  4110.       RETURN 20015
  4111. 20247 DF = 0
  4112.       N$ = FILE.NAME$
  4113.       GOSUB 20282
  4114.       IF INSTR(".WRK.FW .ARC.EXE.COM.OBJ.WKS.LBR",EXTENTION$) OR _
  4115.          MID$(EXTENTION$,3,1) = "Q" OR _
  4116.          (REQUIRE.NON.ASCII AND EXTENTION$ = ".BAS") THEN _
  4117.          A$ = "Non-ASCII transfer required" : _
  4118.          GOSUB 12979 : _
  4119.          DF = TRUE
  4120. 20248 T$ = "Download" + TRANSFER.OPTIONS$
  4121.       GOSUB 21620
  4122.       IF FF THEN _
  4123.          GOTO 20260
  4124.       GOSUB 21600
  4125. 20260 HH = 1
  4126.       ON FF GOTO 20340,20262,20290,20290,57120
  4127. '
  4128. ' *****************************************************************************
  4129. ' *  TEST FOR MNP PROTOCAL AVAILABLE                                          *
  4130. ' *****************************************************************************
  4131. '
  4132. 20262 IF NOT MNP.SUPPORT THEN _
  4133.          A$ = "MNP unavailable" : _
  4134.          GOSUB 12979 : _
  4135.          ON HH GOTO 57120,57120
  4136.       LL = HH*HH
  4137.       LL = LL-HH
  4138.       GOSUB 20264
  4139.       ON LL + HH GOTO 20385,20266,20660,20730
  4140.       STOP
  4141. '
  4142. ' *****************************************************************************
  4143. ' *  MNP INTERFACE FOR DOWNLOADS & UPLOADS                                    *
  4144. ' *****************************************************************************
  4145. '
  4146. 20264 A$ = "MNP not yet available with the new BASIC compilers"
  4147.       GOSUB 12975
  4148.       RETURN
  4149. '      CLOSE 3
  4150. '      OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1
  4151. '      CALL MNP(HH,FILE.NAME$,COM.PORT$,BPS)
  4152. '      OPEN COM.PORT$ + _
  4153. '           ":" + _
  4154. '           MID$("    300 4501200240048009600",(-4*BPS),4) + _
  4155. '           "," + _
  4156. '           MID$("N,8,1E,7,",6 + 5*EIGHT.BIT,4) + _
  4157. '           "1,RS,CD,DS" AS 3
  4158. '      RETURN
  4159. '
  4160. ' *****************************************************************************
  4161. ' *  DOWNLOAD ABORT                                                           *
  4162. ' *****************************************************************************
  4163. '
  4164. 20266 A$ = "<Download aborted>"
  4165.       DOWNLOAD.COMPLETED = FALSE
  4166.       GOTO 20390
  4167. 20282 CALL ALLCAPS (N$)
  4168.       Z$ = N$
  4169.       IF MID$(Z$,2,1) = ":" THEN _
  4170.          DR$ = LEFT$(Z$,1) : _
  4171.          S = 3 _
  4172.       ELSE DR$ = "" : _
  4173.            S = 1
  4174. 20283 XXX = INSTR(Z$ + ".",".")
  4175.       X$ = MID$(Z$,S,XXX-S)
  4176.       EXTENTION$ = MID$(Z$,XXX + 1,3)
  4177.       RETURN
  4178. 20285 OK = FALSE
  4179.       K = 0
  4180.       L = LEN(A$)
  4181. 20286 K = K + 1
  4182.       IF K > L THEN _
  4183.          GOTO 20288
  4184.       B$ = MID$(Z$,K,1)
  4185.       IF B$ = "*" THEN _
  4186.          RETURN
  4187. 20287 IF B$ <> "?" AND MID$(A$,K,1) <> B$ THEN _
  4188.          OK = TRUE : _
  4189.          RETURN
  4190.       GOTO 20286
  4191. 20288 IF L < LEN(Z$) AND MID$(Z$,L + 1,1) <> "*" THEN _
  4192.          OK = TRUE
  4193.       RETURN
  4194. '
  4195. ' *****************************************************************************
  4196. ' *  XMODEM DOWNLOAD DRIVER                                                   *
  4197. ' *****************************************************************************
  4198. '
  4199. 20290 CLOSE 2
  4200.       IF SHARE.IT THEN _
  4201.          OPEN FILE.NAME$ FOR RANDOM SHARED AS #2 LEN=128 _
  4202.          ELSE OPEN "R",2,FILE.NAME$,128
  4203.       TLA = 165
  4204.       GOSUB 20750
  4205.       A1$ = "SEND"
  4206.       GOSUB 20320
  4207.       GOSUB 21300
  4208.       A$ = ""
  4209.       GOTO 20390
  4210. 20320 IF NOT EIGHT.BIT THEN _
  4211.          A$ = "Please SWITCH to N,8,1 for binary transfer" : _
  4212.          GOSUB 12975 : _
  4213.          SUBROUTINE.PARAMETER = 3 : _
  4214.          CALL DELAYIT
  4215. 20325 XMODEM.TYPE$ = " ": _
  4216.       NEGATIVE.ACKNOWLEDGE$ = CHR$(21): _
  4217.       SOL = 132
  4218.       IF FT$ = "C" THEN _
  4219.          NEGATIVE.ACKNOWLEDGE$ = FT$: _
  4220.          SOL = 133: _
  4221.          XMODEM.TYPE$ = "/CRC "
  4222. 20330 A$ = "XMODEM" + _
  4223.             XMODEM.TYPE$ + _
  4224.             A1$ + _
  4225.             " ready.  <Ctrl X> aborts"
  4226.       GOSUB 12979
  4227.       RETURN
  4228. '
  4229. ' *****************************************************************************
  4230. ' *  ASCII DOWNLOAD DRIVER                                                    *
  4231. ' *****************************************************************************
  4232. '
  4233. 20340 IF DF THEN _
  4234.          A$ = "Switch to XMODEM or MNP" : _
  4235.          GOSUB 12979 : _
  4236.          GOTO 20015
  4237.       CALL OPENWORK
  4238.       TLA = 139
  4239.       GOSUB 20750
  4240.       A$ = "* <Ctrl X> aborts <Ctrl S> suspends *"
  4241.       GOSUB 12977
  4242.       A$ = "ASCII SEND ready. Press [ENTER] to start"
  4243.       GOSUB 12995
  4244. 20380 STOP.INTERRUPTS = TRUE
  4245.       GOSUB 6030
  4246.       IF RET THEN _
  4247.          A$ = "<*>Download aborted<*>" : _
  4248.          DOWNLOAD.COMPLETED = FALSE : _
  4249.          GOTO 20390
  4250. 20381 A$ = CHR$(26)
  4251.       GOSUB 12977
  4252.       IF NOT LOCAL.USER AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4253.          FOR X = 1 TO 5 : _
  4254.            PRINT #3,CHR$(7) : _
  4255.            SUBROUTINE.PARAMETER = 3 : _
  4256.            CALL DELAYIT : _
  4257.          NEXT
  4258. 20385 A$ = "<End of file>"
  4259.       DOWNLOAD.COMPLETED = TRUE
  4260. 20390 GOSUB 12977
  4261.       GOTO 50600
  4262. '
  4263. ' *****************************************************************************
  4264. ' *  U - COMMAND FROM FILES MENU (UPLOAD)                                     *
  4265. ' *****************************************************************************
  4266. '
  4267. 20400 GOSUB 41010
  4268.       Q! = TCA!
  4269.       IF Q > 1 THEN _
  4270.          B$(1) = B$(2) : _
  4271.          GOTO 20430
  4272. 20420 A$ = "Enter full filename to upload"
  4273.       GOSUB 12995
  4274.       IF Q = 0 THEN _
  4275.          RETURN
  4276. '
  4277. ' *****************************************************************************
  4278. ' *  SEARCH FOR DUPLICATE FILENAME                                            *
  4279. ' *****************************************************************************
  4280. '
  4281. 20430 Z$ = B$(1)
  4282.       VIOLATION$ = "Upload "
  4283.       FOR SUBDIR.INDEX = 1 TO SUBDIR.COUNT
  4284.         CALL BADFILE
  4285.         ON BAD.FILE.NAME.INDEX GOTO 20440,20451,20515
  4286. 20440   CALL OPENWORK
  4287. 20450   IF EC = 53 THEN _
  4288.            GOTO 20455
  4289.         IF EC = 61 THEN _
  4290.            GOTO 13480
  4291.         IF EC = 0 THEN _
  4292.            OK = TRUE : _
  4293.            GOTO 20452
  4294. 20451   A$ = "Invalid file name"
  4295.         GOSUB 12979
  4296.         GOTO 20420
  4297. 20452   IF USER.SECURITY.LEVEL >= OVERWRITE.SECURITY.LEVEL THEN _
  4298.            A$ = "Overwrite file" : _
  4299.            GOSUB 12995 : _
  4300.            IF YES THEN _
  4301.               Z$ = FILE.NAME$ : _
  4302.               KILL FILE.NAME$ : _
  4303.               GOTO 20475
  4304. 20453   CLOSE 2
  4305.         A$ = Z$ + " exists! Please use a new file name"
  4306.         GOSUB 12977
  4307.         GOTO 20420
  4308. 20455 NEXT
  4309.       FILE.NAME.HOLD$ = Z$
  4310.       Z$ = UPLOAD.DIRECTORY$
  4311. 20475 GOSUB 12977
  4312.       CALL FINDFREE
  4313.       IF VAL(FREE.SPACE$) < 2000 THEN _
  4314.          GOTO 20015
  4315.       A$ = "Upload disk has" + FREE.SPACE$
  4316.       GOSUB 12977
  4317.       LINE.25$ = "(U) " + FILE.NAME.HOLD$
  4318.       SUBROUTINE.PARAMETER = 2
  4319.       CALL LINE25
  4320.       T$ = "Upload" + TRANSFER.OPTIONS$
  4321.       IF NOT OK THEN _
  4322.          OK = TRUE
  4323. 20477 GOSUB 21620
  4324.       IF FF THEN _
  4325.          GOTO 20500
  4326.       GOSUB 21600
  4327. 20500 HH = 2
  4328.       ON FF GOTO 20560,20262,20540,20540,20735
  4329. 20510 IF SNOOP THEN _
  4330.          PRINT "<Esc> by SYSOP aborts transfer"
  4331.       RETURN
  4332. 20515 GOSUB 1380
  4333.       RETURN 20420
  4334. '
  4335. ' *****************************************************************************
  4336. ' *  XMODEM UPLOAD DRIVER                                                     *
  4337. ' *****************************************************************************
  4338. '
  4339. 20540 A1$ = "RECEIVE"
  4340.       GOSUB 20320
  4341.       OK = TRUE
  4342.       GOSUB 20860
  4343.       IF OK THEN _
  4344.          BLOCKS.IN.FILE# = (CDBL(LOC(2))*128#) : _
  4345.          GOTO 20700
  4346.       GOTO 20730
  4347. '
  4348. ' *****************************************************************************
  4349. ' *  ASCII UPLOAD                                                             *
  4350. ' *****************************************************************************
  4351. '
  4352. 20560 A$ = "Transfer MUST end with a <Ctrl-K>"
  4353.       GOSUB 12977
  4354.       A$ = "ASCII RECEIVE ready"
  4355.       GOSUB 12979
  4356.       OK = FALSE
  4357.       XOFF = FALSE
  4358.       CLOSE 2
  4359.       OPEN "O",2,FILE.NAME$
  4360.       GOSUB 20510
  4361. 20600 WHILE NOT EOF(3)
  4362.       CALL CARRIER
  4363.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4364.          GOTO 10595
  4365.         IF LOF(3) < 512 AND INP(MODEM.STATUS.REGISTER) >127 THEN _
  4366.            PRINT #3,XOFF$; : _
  4367.            XOFF = TRUE
  4368. 20610   X$ = INPUT$(LOC(3),3)
  4369.         IF INSTR(X$,CHR$(11)) THEN _
  4370.            GOTO 20650
  4371.         OK = TRUE
  4372. 20620   PRINT #2,X$;
  4373.         IF SNOOP THEN _
  4374.            PRINT X$;
  4375. 20621   GOSUB 60000
  4376.         IF KEY.PRESSED$ = ESCAPE$ THEN _
  4377.            GOTO 20745
  4378.         IF NOT OK THEN _
  4379.            GOTO 20670
  4380. 20630 WEND
  4381.       CALL CARRIER
  4382.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4383.          GOTO 10595
  4384.       IF XOFF AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4385.          XOFF = FALSE : _
  4386.          PRINT #3,XON$;
  4387.       GOTO 20600
  4388. 20650 X = INSTR(X$,CHR$(11))
  4389.       IF X <> 1 THEN _
  4390.          PRINT #2,LEFT$(X$,X-1) _
  4391.       ELSE IF NOT OK THEN _
  4392.               GOTO 20730
  4393. 20660 A$ = "Upload complete"
  4394.       GOSUB 12979
  4395. 20661 CLOSE 2
  4396. 20662 OPEN "A",2,FILE.NAME$
  4397. 20663 BLOCKS.IN.FILE# = (CDBL(LOC(2))*128#) + 128
  4398.       GOTO 20700
  4399. 20670 A$ = XOFF$ + "System error! Upload aborted <Ctrl-K> continues"
  4400. 20675 GOSUB 12979
  4401.       SUBROUTINE.PARAMETER = 3
  4402.       CALL DELAYIT
  4403.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4404.         PRINT #3,XON$;
  4405. 20680 WHILE NOT EOF(3)
  4406.         X$ = INPUT$(LOC(3),3)
  4407.         IF INSTR(X$,CHR$(11)) THEN _
  4408.            GOTO 20730
  4409. 20685   CALL CARRIER
  4410.         IF SUBROUTINE.PARAMETER = -1 THEN _
  4411.            GOTO 10595
  4412.       WEND
  4413.       GOTO 20680
  4414. '
  4415. ' *****************************************************************************
  4416. ' *  UPDATE UPLOAD DIRECTORY                                                  *
  4417. ' *****************************************************************************
  4418. '
  4419. 20700 BX = &H4
  4420.       EN$ = UPLOAD.DIRECTORY$
  4421.       GOSUB 12992
  4422.       CLOSE 2
  4423.       IF SHARE.IT THEN _
  4424.          OPEN UPLOAD.DIRECTORY$ FOR APPEND SHARED AS #2 _
  4425.       ELSE OPEN "A",2,UPLOAD.DIRECTORY$
  4426.       BX = &H4
  4427.       EN$ = UPLOAD.DIRECTORY$
  4428.       GOSUB 12993
  4429. 20710 A$ = "Describe " + _
  4430.            FILE.NAME.HOLD$ + _
  4431.            " (/ if for SYSOP only)" + _
  4432.            RETURN.LINE.FEED$ + _
  4433.            " |----+---1+0---+---2+0---+---3+0---+---4+0"
  4434.       GOSUB 12975
  4435.       GOSUB 12995
  4436.       IF LEN(B$(1)) > 40 THEN _
  4437.          GOTO 20710
  4438. 20720 IF LEFT$(B$(1),1) = "/" THEN _
  4439.          GOTO 20725
  4440.       PRINT #2,USING "\           \########  &  &"; _
  4441.                      FILE.NAME.HOLD$; _
  4442.                      BLOCKS.IN.FILE#; _
  4443.                      LEFT$(DATE$ ,6) + _
  4444.                      RIGHT$(DATE$ ,2); _
  4445.                      B$(1)
  4446. 20725 CLOSE 2
  4447.       Y$ = " >> uploaded << "
  4448.       UPLOADS = UPLOADS + 1
  4449.       GOSUB 41010
  4450.       SECONDS.PER.SESSION! = SECONDS.PER.SESSION! + _
  4451.                              UPLOAD.TIME.FACTOR! * _
  4452.                              (TCA!-Q!)
  4453.       GOTO 50610
  4454. 20730 A$ = "Upload aborted"
  4455.       GOSUB 12979
  4456. 20735 CLOSE 2
  4457. 20736 KILL FILE.NAME$
  4458.       RETURN
  4459. '
  4460. ' *****************************************************************************
  4461. ' *  SYSOP ABORTED UPLOAD                                                     *
  4462. ' *****************************************************************************
  4463. '
  4464. 20745 A$ = XOFF$ + "SYSOP aborted upload. Stop tranfer. <Ctrl-K> continues"
  4465.       GOTO 20675
  4466. '
  4467. ' *****************************************************************************
  4468. ' *  CALCULATE DOWNLOAD TIME ESTIMATE                                         *
  4469. ' *****************************************************************************
  4470. '
  4471. 20750 IX# = FIX(LOF(2) / 128)
  4472.       BLOCKS.IN.FILE# = LOF(2) / 128
  4473.       IF IX# <> BLOCKS.IN.FILE# THEN _
  4474.          BLOCKS.IN.FILE# = BLOCKS.IN.FILE# + 1
  4475. 20780 A$ = STR$(INT(BLOCKS.IN.FILE#)) + " blocks in file"
  4476.       GOSUB 12979
  4477.       BLOCKS.IN.FILE# = BLOCKS.IN.FILE# * _
  4478.                         TLA / _
  4479.                         VAL(MID$("00030045120240480960",-3*BPS,3))
  4480.       IF LOF(2) < 1 THEN _
  4481.          GOTO 20015
  4482. 20790 SUBROUTINE.PARAMETER = 2
  4483.       CALL LINE25
  4484.       A$ = "Transfer time:" + _
  4485.          STR$(INT(BLOCKS.IN.FILE# / 60)) + " minutes," + _
  4486.          STR$(INT(BLOCKS.IN.FILE#-(INT(BLOCKS.IN.FILE#/60)*60))) + _
  4487.          " seconds"
  4488.       GOSUB 12979
  4489.       GOSUB 41000
  4490.       IF (INT(BLOCKS.IN.FILE# / 60) + 1) > INT(TIME.REMAINING!) THEN _
  4491.          A$ = "Not enough time left!" : _
  4492.          Z$ = FILE.NAME$ + " " + A$ : _
  4493.          GOSUB 12979 : _
  4494.          SUBROUTINE.PARAMETER = 2 : _
  4495.          CALL UPDTCALR : _
  4496.          GOTO 20015
  4497.       RETURN
  4498. 20810 CALL CARRIER
  4499.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4500.          GOTO 10595
  4501.       Y$ = ""
  4502.       CALL FINDTIME(DELAY!)
  4503.       DELAY! = DELAY! + 2
  4504. 20840 IF NOT EOF(3) THEN _
  4505.          Y$ = INPUT$(LOC(3),3) : _
  4506.          RETURN
  4507. 20850 CALL CHECKTIM (DELAY!)
  4508.       ON SUBROUTINE.PARAMETER GOTO 20840,20851
  4509. 20851 Y$ = ""
  4510.       RETURN
  4511. '
  4512. ' *****************************************************************************
  4513. ' *  XMODEM UPLOAD                                                            *
  4514. ' *****************************************************************************
  4515. '
  4516. 20860 GOSUB 20992
  4517.       IF NOT EIGHT.BIT THEN _
  4518.          GOSUB 21280
  4519. 20900 X$ = ""
  4520.       SEC = 1
  4521.       CLOSE 2
  4522.       OPEN "R",2,FILE.NAME$,128
  4523.       FIELD 2,128 AS Z$
  4524.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4525.          PRINT #3,NEGATIVE.ACKNOWLEDGE$;
  4526.       CALL FINDTIME (TRANSFER.ABORT!)
  4527.       TRANSFER.ABORT! = TRANSFER.ABORT! + WAIT.BEFORE.DISCONNECT
  4528. 20920 FOR X = 1 TO 5
  4529.         GOSUB 60000
  4530.         IF KEY.PRESSED$ = ESCAPE$ THEN _
  4531.            GOTO 21270
  4532.         GOSUB 20810
  4533. 20930   IF LEFT$(Y$,1) = START.OF.HEADER$ THEN _
  4534.            GOTO 21020
  4535. 20940   IF LEFT$(Y$,1) = END.TRANSMISSION$ THEN _
  4536.            GOTO 21220
  4537. 20950   IF LEFT$(Y$,1) = CANCEL$ THEN _
  4538.            GOTO 21230
  4539. 20960   IF Y$ <> "" THEN _
  4540.            GOSUB 21280 : _
  4541.            CALL CHECKTIM (TRANSFER.ABORT!) : _
  4542.            ON SUBROUTINE.PARAMETER GOTO 20920,21230
  4543. 20970 NEXT
  4544.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4545.          PRINT #3,NEGATIVE.ACKNOWLEDGE$;
  4546.       IF SNOOP THEN _
  4547.          PRINT "Upload Timeout"
  4548.       CALL CHECKTIM (TRANSFER.ABORT!)
  4549.       ON SUBROUTINE.PARAMETER GOTO 20990,21230
  4550. 20990 GOTO 20920
  4551. '
  4552. ' *****************************************************************************
  4553. ' *  CHANGE TO 8 BIT FOR XMODEM                                               *
  4554. ' *****************************************************************************
  4555. '
  4556. 20992 GOSUB 20510
  4557.       IF NOT EIGHT.BIT THEN _
  4558.          SUBROUTINE.PARAMETER = 3 : _
  4559.          CALL DELAYIT : _
  4560.          OUT LINE.CONTROL.REGISTER,3
  4561. 20996 SO = 0
  4562.       RETURN
  4563. '
  4564. ' *****************************************************************************
  4565. ' *  XMODEM UPLOAD                                                            *
  4566. ' *****************************************************************************
  4567. '
  4568. 21000 GOSUB 20810
  4569.       IF Y$ = "" THEN _
  4570.          PRINT "Upload Timeout" : _
  4571.          GOTO 21040
  4572. 21020 X$ = X$ + Y$
  4573.       IF LEN(X$) < SOL THEN _
  4574.          GOTO 21000
  4575. 21040 IF LEN(X$) = SOL THEN _
  4576.          GOTO 21090
  4577. 21050 IF LEN(X$) > SOL THEN _
  4578.          GOTO 21180
  4579. 21060 IF X$ = END.TRANSMISSION$ THEN _
  4580.          GOTO 21220
  4581. 21070 IF X$ = CANCEL$ THEN _
  4582.          GOTO 21230
  4583. 21080 GOTO 21170
  4584. 21090 IF SEC <> ASC(MID$(X$,2,1)) THEN _
  4585.          GOTO 21200
  4586. 21100 IF (SEC XOR 255) <> ASC(MID$(X$,3,1)) THEN _
  4587.          GOTO 21210
  4588. 21110 IF FT$ = "X" THEN _
  4589.          WK$ = MID$(X$,4,128): _
  4590.          GOSUB 46000 _
  4591.       ELSE WK$ = MID$(X$,4): _
  4592.            GOSUB 46000
  4593. 21112 IF FT$ = "X" THEN _
  4594.          IF XMODEM.CHECKSUM <> ASC(MID$(X$,132,1)) THEN _
  4595.             GOTO 21190 _
  4596.          ELSE 21120
  4597. 21113 IF CRC.VALUE <> 0 THEN _
  4598.          GOTO 21191
  4599. 21120 SO = SO + 1
  4600.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4601.          PRINT #3,ACKNOWLEDGE$;
  4602. 21131 LSET Z$ = MID$(X$,4)
  4603.       PUT 2
  4604. 21145 SEC = 255 AND (SEC + 1)
  4605.       IF SNOOP THEN _
  4606.          LOCATE ,1 : _
  4607.          PRINT "Verified Rec Blk #";SO;
  4608. 21150 X$=""
  4609.       XMODEM.CHECKSUM = 0
  4610.       CALL FINDTIME(TRANSFER.ABORT!)
  4611.       TRANSFER.ABORT! = TRANSFER.ABORT! + 30
  4612.       GOTO 20920
  4613. 21170 A$ = "Short Blk in #"
  4614.       GOTO 21212
  4615. 21180 A$ = "Long Blk in #"
  4616.       GOTO 21212
  4617. 21190 A$ = "Checksum Error in #"
  4618.       GOTO 21212
  4619. 21191 A$="CRC Error": _
  4620.       GOTO 21212
  4621. 21200 A$ = "Blk # Error in #"
  4622.       IF SEC-1 <> ASC(MID$(X$,2,1)) THEN _
  4623.          GOTO 21212
  4624.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4625.          PRINT #3,ACKNOWLEDGE$;
  4626.       GOTO 21150
  4627. 21210 A$ = "Complement Error in #"
  4628. 21212 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4629.          PRINT #3,NEGATIVE.ACKNOWLEDGE$;
  4630.       IF SNOOP THEN _
  4631.          PRINT LINE.FEED$;A$;SO + 1
  4632.       GOTO 21150
  4633. 21220 IF SNOOP THEN _
  4634.          PRINT LINE.FEED$;"File Closed"
  4635. 21225 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4636.          PRINT #3,ACKNOWLEDGE$;
  4637.       GOTO 21250
  4638. 21230 IF SNOOP THEN _
  4639.          PRINT LINE.FEED$;"Transfer Aborted"
  4640. 21240 OK = FALSE
  4641.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4642.          PRINT #3,CANCEL$;CANCEL$;
  4643. 21250 IF NOT EIGHT.BIT THEN _
  4644.          EIGHT.BIT = TRUE
  4645.       RETURN
  4646. 21270 GOSUB 20510
  4647.       GOSUB 21280
  4648.       GOTO 21230
  4649. '
  4650. ' *****************************************************************************
  4651. ' *  CLEAR GARBAGE OUT OF COMMUNICATIONS BUFFER                               *
  4652. ' *****************************************************************************
  4653. '
  4654. 21280 WHILE NOT EOF(3)
  4655.         CALL CARRIER
  4656.         IF SUBROUTINE.PARAMETER = -1 THEN _
  4657.            GOTO 10595
  4658. 21281   DF$ = INPUT$(LOC(3),3)
  4659.       WEND
  4660.       RETURN
  4661. '
  4662. ' *****************************************************************************
  4663. ' *  XMODEM DOWNLOAD                                                          *
  4664. ' *****************************************************************************
  4665. '
  4666. 21300 GOSUB 20992
  4667.       SEC = 0
  4668.       GOSUB 21280
  4669.       FIELD 2,128 AS X$
  4670.       NEGATIVE.ACKNOWLEDGE$=CHR$(21)
  4671.       CALL FINDTIME (TRANSFER.ABORT!)
  4672.       TRANSFER.ABORT! = TRANSFER.ABORT! + WAIT.BEFORE.DISCONNECT
  4673. 21350 WHILE NOT EOF(3)
  4674. 21360   Y$ = INPUT$(1,3)
  4675.         IF Y$ = CANCEL$ THEN _
  4676.            GOTO 21560
  4677. 21380   IF Y$ = NEGATIVE.ACKNOWLEDGE$ THEN _
  4678.            FF = 3: _
  4679.            FT$ = "X": _
  4680.            GOTO 21480 _
  4681.         ELSE IF Y$ = "C" THEN _
  4682.            FF = 4: _
  4683.            FT$ = "C": _
  4684.            GOTO 21480
  4685. 21390 WEND
  4686.       GOSUB 21460
  4687.       CALL CHECKTIM (TRANSFER.ABORT!)
  4688.       ON SUBROUTINE.PARAMETER GOTO 21350,21455
  4689. 21410 CALL FINDTIME (TI!)
  4690.       TRANSFER.ABORT! = TI! + WAIT.BEFORE.DISCONNECT
  4691. 21415 WHILE NOT EOF(3)
  4692. 21420   Y$ = INPUT$(1,3)
  4693.         IF Y$ = ACKNOWLEDGE$ THEN _
  4694.            GOTO 21470
  4695. 21440   IF Y$ <> NEGATIVE.ACKNOWLEDGE$ THEN _
  4696.            GOTO 21450
  4697. 21443   IF SNOOP THEN _
  4698.            PRINT LINE.FEED$;"Error -> retrans #";SO
  4699. 21445   SO = SO-1
  4700.         GOTO 21490
  4701. 21450   IF Y$ = CANCEL$ THEN _
  4702.            GOTO 21560
  4703.         CALL CHECKTIM (TRANSFER.ABORT!)
  4704.         ON SUBROUTINE.PARAMETER GOTO 21451,21455
  4705. 21451 WEND
  4706.       GOSUB 21460
  4707.       CALL CHECKTIM (TRANSFER.ABORT!)
  4708.       ON SUBROUTINE.PARAMETER GOTO 21410,21455
  4709. 21455 IF SNOOP THEN _
  4710.          PRINT "Download timeout"
  4711.       GOTO 21560
  4712. 21460 CALL CARRIER
  4713.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4714.          GOTO 10595
  4715.       GOSUB 60000
  4716.       IF KEY.PRESSED$ = ESCAPE$ THEN _
  4717.          RETURN 21540
  4718.       RETURN
  4719. 21470 IF SNOOP THEN _
  4720.          LOCATE ,1 : PRINT "Verified Sent Block #";SO;
  4721. 21480 IF LOC(2) < LOF(2) / 128 THEN _
  4722.          GET 2,(LOC(2) + 1) : _
  4723.          SEC = 255 AND (SEC + 1) : _
  4724.          GOTO 21490
  4725. 21482 IF SNOOP THEN _
  4726.          PRINT LINE.FEED$;"End of file"
  4727. 21485 GOTO 21530
  4728. 21490 SO = SO + 1
  4729.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4730.          PRINT #3,START.OF.HEADER$; CHR$(SEC); CHR$(SEC XOR 255);X$;
  4731. 21503 IF FT$ = "X" THEN _
  4732.          WK$=X$ _
  4733.       ELSE WK$ = X$ + CHR$(0) + CHR$(0)
  4734. 21504 GOSUB 46000
  4735. 21510 IF FT$ = "X" AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4736.          PRINT#3,CHR$(XMODEM.CHECKSUM); _
  4737.       ELSE IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4738.               PRINT#3,CHR$(CRC.HIGH);CHR$(CRC.LOW);
  4739.       GOSUB 21280
  4740.       GOTO 21410
  4741. '
  4742. ' *****************************************************************************
  4743. ' *  END-OF-FILE FOR XMODEM DOWNLOADS -- SEND THE "EOT" CHARACTER AND WAIT UP *
  4744. ' *  TO 2 SECONDS FOR A POSITIVE RESPONSE (I.E. AN "ACK").  IF NONE IS        *
  4745. ' *  RE-TRY UP TO 10 TIMES.  IF NO POSITIVE RESPONSE IS RECEIVED AFTER TEN    *
  4746. ' *  ATTEMPTS, ASSUME THE DOWNLOAD WAS UNSUCCESSFULL.                         *
  4747. ' *****************************************************************************
  4748. '
  4749. 21530 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4750.          PRINT #3,END.TRANSMISSION$;
  4751.       FOR X = 1 TO 10
  4752.           GOSUB 20810
  4753.           IF INSTR(Y$,ACKNOWLEDGE$) THEN _
  4754.              GOTO 21550
  4755.           GOSUB 60000
  4756.           IF KEY.PRESSED$ = ESCAPE$ THEN _
  4757.              GOTO 21540
  4758. 21535 NEXT
  4759.       DOWNLOAD.COMPLETED = FALSE
  4760.       GOTO 21230
  4761. 21540 GOSUB 20510
  4762. 21545 Y$ = CANCEL$
  4763.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4764.          PRINT #3,CANCEL$;CANCEL$;
  4765.       DOWNLOAD.COMPLETED = FALSE
  4766.       GOTO 21250
  4767. 21550 DOWNLOAD.COMPLETED = TRUE
  4768.       GOTO 21250
  4769. 21560 DOWNLOAD.COMPLETED = FALSE
  4770.       IF SNOOP THEN _
  4771.          PRINT LINE.FEED$;"Receiver aborted transfer"
  4772.       GOTO 21545
  4773. '
  4774. ' *****************************************************************************
  4775. ' *  MANUAL SELECT OF TRANSFER PROTOCAL                                       *
  4776. ' *****************************************************************************
  4777. '
  4778. 21600 CR = 0
  4779.       A$ = T$
  4780.       GOSUB 12995
  4781.       IF Q = 0 THEN _
  4782.          GOTO 21600
  4783.       Z$ = B$(1)
  4784. '
  4785. ' *****************************************************************************
  4786. ' *  DEFAULT SELECT OF TRANSFER PROTOCAL                                      *
  4787. ' *****************************************************************************
  4788. '
  4789. 21610 CALL ALLCAPS (Z$)
  4790.       FF = INSTR("AMXCN",Z$)
  4791.       IF FF < 1 OR (FF = 2 AND NOT MNP.SUPPORT) THEN _
  4792.          GOTO 21600
  4793.       FT$ = MID$("AMXC ",FF,1)
  4794.       RETURN
  4795. 21620 FF = -1
  4796.       IF Q > 2 THEN _
  4797.          Z$ = B$(3) : _
  4798.          GOTO 21610
  4799.       IF USER.TRANSFER.DEFAULT$ > " " THEN _
  4800.          Z$ = USER.TRANSFER.DEFAULT$ : _
  4801.          GOTO 21610
  4802.       FF = 0
  4803.       RETURN
  4804. '
  4805. ' *****************************************************************************
  4806. ' *  GET MESSAGE HEADER RECORD DATA                                           *
  4807. ' *****************************************************************************
  4808. '
  4809. 23000 GET 1,1
  4810.       HIGH.MESSAGE.NUMBER = VAL(LEFT$(MESSAGE.RECORD$,8))
  4811.       CALLS.TODATE! = VAL(MID$(MESSAGE.RECORD$,11,10))
  4812.       CURRENT.USER.COUNT = VAL(MID$(MESSAGE.RECORD$,57,5))
  4813.       HIGHEST.USER.RECORD = VAL(MID$(MESSAGE.RECORD$,62,5))
  4814.       FIRST.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,68,7))
  4815.       NEXT.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,75,7))
  4816.       HIGHEST.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,82,7))
  4817.       NODES.IN.SYSTEM = VAL(MID$(MESSAGE.RECORD$,127))
  4818.       IF NOT SYSOP AND NOT LOCAL.USER THEN RETURN
  4819.       IF LAST.MESSAGE.READ < VAL(MID$(MESSAGE.RECORD$,123,4)) THEN _
  4820.          LAST.MESSAGE.READ = VAL(MID$(MESSAGE.RECORD$,123,4))
  4821.       LAST.MESSAGE.READ = - LAST.MESSAGE.READ * _
  4822.                       (LAST.MESSAGE.READ <= HIGH.MESSAGE.NUMBER)
  4823.       RETURN
  4824. '
  4825. '
  4826. ' *****************************************************************************
  4827. ' *  UPDATE MESSAGE HEADER RECORD DATA                                        *
  4828. ' *****************************************************************************
  4829. '
  4830. 24000 MID$(MESSAGE.RECORD$,1,8) = STR$(HIGH.MESSAGE.NUMBER)
  4831.       MID$(MESSAGE.RECORD$,11,10) = STR$(CALLS.TODATE!)
  4832.       MID$(MESSAGE.RECORD$,57,5) = STR$(CURRENT.USER.COUNT)
  4833.       MID$(MESSAGE.RECORD$,62,5) = STR$(HIGHEST.USER.RECORD)
  4834.       MID$(MESSAGE.RECORD$,68,7) = STR$(FIRST.MESSAGE.RECORD)
  4835.       MID$(MESSAGE.RECORD$,75,7) = STR$(NEXT.MESSAGE.RECORD)
  4836.       MID$(MESSAGE.RECORD$,82,7) = STR$(HIGHEST.MESSAGE.RECORD)
  4837.       PUT 1,1
  4838.       RETURN
  4839. '
  4840. ' *****************************************************************************
  4841. ' *  OPEN AND DEFINE MESSAGE FILE                                             *
  4842. ' *****************************************************************************
  4843. '
  4844. 30500 CLOSE 1
  4845.       IF SHARE.IT THEN _
  4846.          OPEN ACTIVE.MESSAGE.FILE$ FOR RANDOM SHARED AS #1 _
  4847.          ELSE OPEN "R",1,ACTIVE.MESSAGE.FILE$
  4848.       FIELD 1,128 AS MESSAGE.RECORD$
  4849.       RETURN
  4850. '
  4851. ' *****************************************************************************
  4852. ' * F1 - COMMAND FROM LOCAL KEYBOARD (IMMEDIATE EXIT TO DOS)                  *
  4853. ' *****************************************************************************
  4854. '
  4855. 31000 IF MULTI.LINK.PRESENT THEN _
  4856.          GOSUB 60500
  4857.       SYSTEM
  4858. '
  4859. ' *****************************************************************************
  4860. ' * F2 - COMMAND FROM LOCAL KEYBOARD (SYSOP EXIT TO DOS AND RETURN)           *
  4861. ' *****************************************************************************
  4862. '
  4863. 32000 IF NOT LOCAL.USER THEN _
  4864.          A$="Sysop has exited to DOS. Please stand by for a few seconds." : _
  4865.          FUNCTION.KEY = 0 : _
  4866.          GOSUB 12976 : _
  4867.          SUBROUTINE.PARAMETER = 3 : _
  4868.          CALL DELAYIT
  4869.       SHELL DISK.FOR.DOS$+"COMMAND"
  4870.       CLS
  4871.       IF NOT LOCAL.USER THEN _
  4872.          CALL CARRIER : _
  4873.          IF SUBROUTINE.PARAMETER = -1 THEN _
  4874.             GOTO 10595 ELSE : _
  4875.          SUBROUTINE.PARAMETER = 2 : _
  4876.          CALL LINE25 : _
  4877.          A$ = "Sysop has returned from DOS.  Thanks for waiting." : _
  4878.          GOSUB 12977
  4879.       RETURN
  4880. '
  4881. ' *****************************************************************************
  4882. ' * F3 - COMMAND FROM LOCAL KEYBOARD (PRINTER TOGGLE)                         *
  4883. ' *****************************************************************************
  4884. '
  4885. 33000 PRINTER = NOT PRINTER
  4886.       CHANGE.VALUE = PRINTER
  4887.       FIELD.POSITION = 38
  4888.       GOTO 33950
  4889. '
  4890. ' *****************************************************************************
  4891. ' * F4 - COMMAND FROM LOCAL KEYBOARD (SYSOP ANNOY)                            *
  4892. ' *****************************************************************************
  4893. '
  4894. 33040 SYSOP.ANNOY = NOT SYSOP.ANNOY
  4895.       CHANGE.VALUE = SYSOP.ANNOY
  4896.       FIELD.POSITION = 34
  4897.       GOTO 33950
  4898. '
  4899. ' *****************************************************************************
  4900. ' * F5 - COMMAND FROM LOCAL KEYBOARD (FORCE CALLER ONLINE)                    *
  4901. ' *****************************************************************************
  4902. '
  4903. 33060 FUNCTION.KEY = 0
  4904.       SUBROUTINE.PARAMETER = 4
  4905.       RETURN 200
  4906. '
  4907. ' *****************************************************************************
  4908. ' * F6 - COMMAND FROM LOCAL KEYBOARD (SYSOP AVAILABLE TOGGLE)                 *
  4909. ' *  6 - COMMAND FROM SYSOP MENU (SYSOP AVAILABLE TOGGLE)                     *
  4910. ' *****************************************************************************
  4911. '
  4912. 33070 SYSOP.AVAILABLE = NOT SYSOP.AVAILABLE
  4913.       CHANGE.VALUE = SYSOP.AVAILABLE
  4914.       FIELD.POSITION = 32
  4915.       GOTO 33950
  4916. '
  4917. ' *****************************************************************************
  4918. ' * F7 - COMMAND FROM LOCAL KEYBOARD (SYSOP GETS SYSTEM NEXT)                 *
  4919. ' *****************************************************************************
  4920. '
  4921. 33090 IF ERR=61 AND NOT DISKFULL.GO.OFFLINE THEN RETURN
  4922.       SYSOP.NEXT = NOT SYSOP.NEXT
  4923.       CHANGE.VALUE = SYSOP.NEXT
  4924.       FIELD.POSITION = 36
  4925.       GOTO 33950
  4926. '
  4927. ' *****************************************************************************
  4928. ' * F8 - COMMAND FROM LOCAL KEYBOARD (ASSIGN USER TEMPORARY SYSOP SECURITY)   *
  4929. ' *****************************************************************************
  4930. '
  4931. 33110 SYSOP = NOT SYSOP
  4932.       CURSOR.LINE = CSRLIN
  4933.       CURSOR.ROW = POS(0)
  4934.       LOCATE 25,1
  4935.       PRINT SPACE$(79);
  4936.       LOCATE 25,1
  4937.       USER.SECURITY.LEVEL = (1 + SYSOP) * _
  4938.                             USER.SECURITY.SAVE  - _
  4939.                             SYSOP * _
  4940.                             SYSOP.SECURITY.LEVEL
  4941.       PRINT "Temp SYSOP Privileges "; MID$("OFFON",1-3*SYSOP,3);
  4942.       SUBROUTINE.PARAMETER = 3
  4943.       CALL DELAYIT
  4944.       LOCATE CURSOR.LINE,CURSOR.ROW
  4945.       SUBROUTINE.PARAMETER = 1
  4946.       CALL LINE25
  4947.       RETURN
  4948. '
  4949. ' *****************************************************************************
  4950. ' * F9 - COMMAND FROM LOCAL KEYBOARD (SNOOP TOGGLE)                           *
  4951. ' *****************************************************************************
  4952. '
  4953. 33130 IF NOT SNOOP THEN _
  4954.          SNOOP = TRUE : _
  4955.          LOCATE 23,1,0 : _
  4956.          PRINT "SNOOP ON" : _
  4957.          SUBROUTINE.PARAMETER = 2 : _
  4958.          CALL LINE25 _
  4959.       ELSE LOCATE ,,0 : _
  4960.            SNOOP = FALSE : _
  4961.            CLS
  4962. 33140 CHANGE.VALUE = SNOOP
  4963.       FIELD.POSITION = 58
  4964.       GOTO 33950
  4965. '
  4966. ' *****************************************************************************
  4967. ' * F10 - COMMAND FROM LOCAL KEYBOARD (FORCE CHAT WITH USER)                  *
  4968. ' *****************************************************************************
  4969. '
  4970. 33150 IF ACTIVE.MENU$ = "M" OR _
  4971.          ACTIVE.MENU$ = "U" OR _
  4972.          ACTIVE.MENU$ = "F" THEN _
  4973.          GOTO 33160
  4974.       CURSOR.LINE = CSRLIN
  4975.       CURSOR.ROW = POS(0)
  4976.       LOCATE 25,1
  4977.       PRINT SPACE$(79);
  4978.       LOCATE 25,1
  4979.       PRINT "Cannot CHAT until user reaches MAIN menu";
  4980.       SUBROUTINE.PARAMETER = 1
  4981.       CALL DELAYIT
  4982.       LOCATE CURSOR.LINE,CURSOR.ROW
  4983.       SUBROUTINE.PARAMETER = 1
  4984.       CALL LINE25
  4985.       RETURN
  4986. 33160 Z$ = "Sysop initiated chat"
  4987.       SUBROUTINE.PARAMETER = 1
  4988.       CALL UPDTCALR
  4989.       A$ = "Hi " + _
  4990.            FIRST.NAME$ + _
  4991.            ", this is " + _
  4992.            SYSOP.FIRST.NAME$ + _
  4993.            " " + _
  4994.            SYSOP.LAST.NAME$ + _
  4995.            " in CHAT mode. Sorry to break in but.."
  4996.       FUNCTION.KEY = 0
  4997.       GOSUB 12976
  4998.       GOTO 4770
  4999. '
  5000. ' *****************************************************************************
  5001. ' * PGUP DISPLAY USER PROFILE                                                 *
  5002. ' *****************************************************************************
  5003. '
  5004. 33200 DEF SEG = 0
  5005.       IF (PEEK(&H410) AND &H30) <> &H30 THEN _
  5006.          DEF SEG : _
  5007.          SCREEN ,,0,1 : _
  5008.       ELSE GOSUB 33900
  5009.       DEF SEG
  5010.       RETURN
  5011. '
  5012. ' *****************************************************************************
  5013. ' * PGDN RETURN TO NORMAL DISPLAY                                             *
  5014. ' *****************************************************************************
  5015. '
  5016. 33300 DEF SEG = 0
  5017.       IF (PEEK(&H410) AND &H30) <> &H30 THEN _
  5018.          DEF SEG : _
  5019.          SCREEN ,,0,0
  5020.       DEF SEG
  5021.       RETURN
  5022. '
  5023. ' *****************************************************************************
  5024. ' * DISPLAY USER PROFILE                                                      *
  5025. ' *****************************************************************************
  5026. '
  5027. 33900 USER.DATA = TRUE
  5028.       DEF SEG = 0
  5029.       IF (PEEK(&H410) AND &H30) <> &H30 THEN _
  5030.          DEF SEG : _
  5031.          LOCATE 2,1 ELSE _
  5032.            DEF SEG : _
  5033.            PRINT
  5034.       PRINT "USER NAME:";MID$(USER.NAME$,1)
  5035.       IF (PEEK(&H410) AND &H30) <> &H30 THEN _
  5036.          DEF SEG : _
  5037.          LOCATE 4,1
  5038.       DEF SEG
  5039.       PRINT "SECURITY :";STR$(USER.SECURITY.LEVEL)
  5040.       PRINT "PASSWORD :";MID$(PASSWORD$,1)
  5041.       PRINT "READ MSG.:";STR$(LAST.MESSAGE.READ)
  5042.       PRINT "TIMES ON :";STR$(TIMES.LOGGED.ON)
  5043.       PRINT "LAST ON  :";MID$(LAST.DATE.TIME.ON$,1)
  5044.       PRINT "DOWNLOADS:";STR$(DOWNLOADS)
  5045.       PRINT "UPLOADS  :";STR$(UPLOADS)
  5046.       PRINT "User's Profile"
  5047.       GOSUB 5410
  5048.       IF USER.DATA = TRUE THEN _
  5049.          USER.DATA = FALSE
  5050.       RETURN
  5051. '
  5052. ' *****************************************************************************
  5053. ' * UPDATE NODE RECORD WITH LOCAL FUNCTION KEY ACTIVITY                       *
  5054. ' *****************************************************************************
  5055. '
  5056. 33950 IF SNOOP THEN _
  5057.          SUBROUTINE.PARAMETER = 1 : _
  5058.          CALL LINE25
  5059. 33960 IF CONFERENCE.MODE = FALSE THEN _
  5060.          GOSUB 12986 : _
  5061.          GOSUB 30500 : _
  5062.          GET 1,NODE.RECORD.INDEX : _
  5063.          MID$(MESSAGE.RECORD$,FIELD.POSITION,2) = STR$(CHANGE.VALUE) : _
  5064.          GOTO 43080
  5065. 33970 PRINT "Cannot change status during Conference!"
  5066.       RETURN
  5067. '
  5068. ' *****************************************************************************
  5069. ' * CALCULATE TIME REMAINING FOR USER                                         *
  5070. ' *****************************************************************************
  5071. '
  5072. 41000 GOSUB 41010
  5073.       IF BYPASS.TIME.CHECK THEN _
  5074.          RETURN
  5075.       IF TIME.REMAINING! < 0 THEN _
  5076.          TIME.REMAINING! = 0 : _
  5077.          RETURN 10553
  5078.       RETURN
  5079. 41010 TOA! = FRE("A")
  5080.       CALL FINDTIME (TI!)
  5081.       IF TI! > USER.LOGON.TIME! THEN _
  5082.          CALL FINDTIME (TCA!) : _
  5083.          TCA! = TCA! - USER.LOGON.TIME! _
  5084.       ELSE CALL FINDTIME (TI!) : _
  5085.       TCA! = TI! + 86400!-USER.LOGON.TIME!
  5086. 41020 TIME.REMAINING! = (SECONDS.PER.SESSION!-TCA!) / 60
  5087.       TIME.REMAINING$ = STR$(INT(TIME.REMAINING!))
  5088.       RETURN
  5089. '
  5090. ' *****************************************************************************
  5091. ' * DISPLAY TIME REMAINING FOR USER                                           *
  5092. ' *****************************************************************************
  5093. '
  5094. 41050 GOSUB 41000
  5095.       A$ = TIME.REMAINING$ + " minutes left"
  5096.       GOSUB 12975
  5097.       RETURN
  5098. '
  5099. ' *****************************************************************************
  5100. ' * SHOW USER CURRENT ACCESS LEVEL                                            *
  5101. ' *****************************************************************************
  5102. '
  5103. 41070 A$ = "Granted access level" + _
  5104.            STR$(USER.SECURITY.LEVEL) + _
  5105.            MID$(" (SYSOP)",1,-8*(USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL))
  5106.       GOSUB 12975
  5107.       RETURN
  5108. '
  5109. ' *****************************************************************************
  5110. ' * NULLS SET FOR NEW USERS                                                   *
  5111. ' *****************************************************************************
  5112. '
  5113. 42700 A$ = "Want nulls (Y/N)"
  5114.       GOSUB 12995
  5115.       IF NO OR YES THEN _
  5116.          NULLS = NO _
  5117.       ELSE 42700
  5118. '
  5119. ' *****************************************************************************
  5120. ' *  N - COMMAND FROM UTILITY MENU (NULLS TOGGLE)                             *
  5121. ' *****************************************************************************
  5122. '
  5123. 42710 NULLS = NOT NULLS
  5124.       GOSUB 9520
  5125. 42720 A$ = "Nulls " + MID$("OffOn",1-3*NULLS,3)
  5126.       IF USER.DATA THEN _
  5127.          PRINT A$ : _
  5128.          RETURN
  5129.       GOSUB 12979
  5130.       RETURN
  5131. '
  5132. ' *****************************************************************************
  5133. ' *  F - COMMAND FROM UTILITY MENU (FILE TRANSFER DEFALUT MODE)               *
  5134. ' *  FILE TRANSFER DEFAULT SET FOR NEW USERS                                  *
  5135. ' *****************************************************************************
  5136. '
  5137. 42800 T$ = "FILE transfer default" + TRANSFER.OPTIONS$
  5138.       GOSUB 21600
  5139.       USER.TRANSFER.DEFAULT$ = FT$
  5140. 42810 A$ = "PROTOCOL: " + MID$("Ascii MNP   XmodemCRC   None",6*FF-5,6)
  5141.       IF USER.DATA THEN _
  5142.          PRINT A$ : _
  5143.          RETURN
  5144.       GOSUB 12979
  5145.       RETURN
  5146. '
  5147. ' *****************************************************************************
  5148. ' *  C - COMMAND FROM UTILITY MENU (CHANGE CASE TOGGLE)                       *
  5149. ' *  UPPER/LOWER CASE SET FOR NEW USERS                                       *
  5150. ' *****************************************************************************
  5151. '
  5152. 42950 A$ = "CAN YOUR TERMINAL DISPLAY LOWER CASE (Y/N)"
  5153.       GOSUB 12995
  5154.       IF NO OR YES THEN _
  5155.          UPPER.CASE = YES _
  5156.       ELSE 42950
  5157. 42960 UPPER.CASE = NOT UPPER.CASE
  5158.       A$ = "UPPER CASE " + MID$("and lowerONLY",1-9*UPPER.CASE,9)
  5159.       IF USER.DATA THEN _
  5160.          PRINT A$ : _
  5161.          RETURN
  5162.       GOSUB 12979
  5163.       RETURN
  5164. '
  5165. ' *****************************************************************************
  5166. ' *  G - COMMAND FROM UTILITY MENU (GRAPHICS WANTED)                          *
  5167. ' *  GRAPHIC MENUS SELECTION SET FOR NEW USERS                                *
  5168. ' *****************************************************************************
  5169. '
  5170. 43000 IF NOT EIGHT.BIT THEN _
  5171.          A$ = "Graphics unavailable" : _
  5172.          GOSUB 12979 : _
  5173.          RETURN
  5174. 43005 A$ = "GRAPHICS wanted: <N>one,<A>scii,<C>olor,<H>elp"
  5175.       GOSUB 12995
  5176.       IF Q = 0 THEN _
  5177.          GOTO 43005
  5178.       CALL ALLCAPS (B$(1))
  5179.       GR = INSTR("NAC",B$(1))
  5180.       IF GR = 0 THEN _
  5181.          USER.RECORD.SAVE$ = USER.RECORD$ : _
  5182.          FILE.NAME$ = HELP$(9) : _
  5183.          GOSUB 1790 : _
  5184.          GOSUB 9400 : _
  5185.          LSET USER.RECORD$ = USER.RECORD.SAVE$ : _
  5186.          GOTO 43005
  5187.       USER.GRAPHIC.DEFAULT$ = MID$(" GC",GR,-(GR > 1))
  5188.       GR = GR-1
  5189. 43020 A$ = "GRAPHICS: " + MID$("None AsciiColor",GR*5 + 1,5)
  5190.       IF USER.DATA THEN _
  5191.          PRINT A$ : _
  5192.          RETURN
  5193.       GOSUB 12979
  5194.       RETURN
  5195. 43025 GOSUB 43030
  5196.       GOTO 45000
  5197. 43030 IF GR THEN _
  5198.          N$ = FILE.NAME$ : _
  5199.          GOSUB 20282 : _
  5200.          IF LEN(X$) < 8 THEN _
  5201.             DF$ = DR$ + _
  5202.                   ":" + _
  5203.                   X$ + _
  5204.                   USER.GRAPHIC.DEFAULT$ + _
  5205.                   "." + _
  5206.                   EXTENTION$ : _
  5207.              FILE.NAME$ = DF$ : _
  5208.              CALL FINDIT : _
  5209.              IF OK THEN _
  5210.                    FILE.NAME$ = DF$ _
  5211.              ELSE FILE.NAME$ = N$
  5212.       RETURN
  5213. '
  5214. ' *****************************************************************************
  5215. ' *  UPDATE CALLERS FILE AT LOGOFF                                            *
  5216. ' *****************************************************************************
  5217. '
  5218. 43050 FIELD 4,55 AS CALLERS.RECORD$,3 AS HOURS$,3 AS MINUTES$,3 AS SECONDS$
  5219.       LSET CALLERS.RECORD$ = MID$(NG$,65,55)
  5220.       LSET HOURS$ = STR$(HHH)
  5221.       LSET MINUTES$ = STR$(MMM)
  5222.       LSET SECONDS$ = STR$(SSS)
  5223.       CALLERS.FILE.INDEX = CALLERS.FILE.INDEX + 1
  5224.       PUT 4,CALLERS.FILE.INDEX
  5225.       FIELD 4,64 AS CALLERS.RECORD$
  5226.       LSET CALLERS.RECORD$ = LEFT$(NG$,64)
  5227.       CALLERS.FILE.INDEX = CALLERS.FILE.INDEX + 1
  5228.       PUT 4,CALLERS.FILE.INDEX
  5229. 43060 LSET CALLERS.RECORD$ = STRING$(64,CHR$(0))
  5230.       PUT 4
  5231.       PUT 4
  5232.       IF FIRST.NAME$ = SYSOP.FIRST.NAME$ AND _
  5233.          LAST.NAME$ = SYSOP.LAST.NAME$ THEN _
  5234.          SYSOP = TRUE _
  5235.       ELSE SYSOP = FALSE
  5236. '
  5237. ' *****************************************************************************
  5238. ' *  SAVE USER PROFILE WHEN EXITING                                           *
  5239. ' *****************************************************************************
  5240. '
  5241. 43070 GOSUB 12986
  5242.       GOSUB 30500
  5243.       GET 1,NODE.RECORD.INDEX
  5244.       MID$(MESSAGE.RECORD$,40,2) = STR$(EXIT.TO.DOORS)
  5245.       MID$(MESSAGE.RECORD$,42,2) = STR$(EIGHT.BIT)
  5246.       MID$(MESSAGE.RECORD$,44,2) = STR$(BPS)
  5247.       MID$(MESSAGE.RECORD$,46,2) = STR$(UPPER.CASE)
  5248.       MID$(MESSAGE.RECORD$,48,5) = SPACE$(5)
  5249.       KG = TRUE
  5250.       GOSUB 41010
  5251.       MID$(MESSAGE.RECORD$,48,5) = STR$(TIME.REMAINING!)
  5252.       MID$(MESSAGE.RECORD$,53,2) = STR$(GR)
  5253.       MID$(MESSAGE.RECORD$,55,2) = STR$(SYSOP)
  5254. 43080 PUT 1,NODE.RECORD.INDEX
  5255.       GOSUB 12985
  5256.       GOSUB 30500
  5257.       RETURN
  5258. '
  5259. ' *****************************************************************************
  5260. ' *  DISPLAY NON-BREAKABLE TEXT FILES                                         *
  5261. ' *****************************************************************************
  5262. '
  5263. 45000 STOP.INTERRUPTS = FALSE
  5264.       GOSUB 6000
  5265.       STOP.INTERRUPTS = TRUE
  5266.       RETURN
  5267. '
  5268. ' *****************************************************************************
  5269. ' * MAKE INPUT STRING HIDDEN (USE *'S TO ECHO INPUT)                          *
  5270. ' *****************************************************************************
  5271. '
  5272. 45010 HIDDEN = TRUE
  5273.       GOSUB 12995
  5274.       HIDDEN = FALSE
  5275.       GOSUB 12979
  5276.       RETURN
  5277. '
  5278. ' *****************************************************************************
  5279. ' *  XMODEM / CRC INTERFACE                                                   *
  5280. ' *****************************************************************************
  5281. '
  5282. 46000 XMODEM.CHECKSUM = 0
  5283.       CRC.VALUE = 0
  5284.       CALL XMODEM(WK$,XMODEM.CHECKSUM,CRC.VALUE,CRC.HIGH,CRC.LOW)
  5285.       RETURN
  5286. '
  5287. ' *****************************************************************************
  5288. ' *  DISPLAY MESSAGE & COMMENT EDIT PROMPT LINE                               *
  5289. ' *****************************************************************************
  5290. '
  5291. 50400 A$ = "A)bort, C)ontinue, D)elete, E)dit, I)nsert, L)ist, M)argin, S)ave"
  5292.       GOSUB 12975
  5293.       RETURN
  5294. '
  5295. ' *****************************************************************************
  5296. ' * UPDATE DOWNLOAD STATISTICS                                                *
  5297. ' *****************************************************************************
  5298. '
  5299. 50600 IF DOWNLOAD.COMPLETED THEN _
  5300.          DOWNLOADS = DOWNLOADS + 1 : _
  5301.          Y$ = " Downloaded " _
  5302.       ELSE Y$ = " Aborted "
  5303. 50610 IF LOCAL.USER THEN _
  5304.          RETURN
  5305.       SUBROUTINE.PARAMETER = 2
  5306.       CALL AMORPM
  5307.       Z$ = FILE.NAME$ + Y$ + "at " + TIM$ + " using " + FT$
  5308.       SUBROUTINE.PARAMETER = 2
  5309.       CALL UPDTCALR
  5310.       IF LEFT$(B$(1),1) = "/" THEN _
  5311.          Z$ =  + "  file desc: " + B$(1) : _
  5312.          SUBROUTINE.PARAMETER = 2 : _
  5313.          CALL UPDTCALR
  5314.       RETURN
  5315. '
  5316. ' *****************************************************************************
  5317. ' *   DIRECTORY SEARCH                                                        *
  5318. ' *****************************************************************************
  5319. '
  5320. 52900 CK = 2
  5321.       IF Q > 1 THEN _
  5322.          GOTO 52920
  5323. 52910 A$ = "Search for string (Press [ENTER] to quit)"
  5324.       GOSUB 12995
  5325.       IF Q = 0 THEN _
  5326.          RETURN
  5327.       B$(2) = B$(1)
  5328. 52920 CALL ALLCAPS (B$(2))
  5329.       RS$ = B$(2)
  5330.       A1$ = B$(2)
  5331.       Z$ = B$(2)
  5332.       CALL BADFILE
  5333.       ON BAD.FILE.NAME.INDEX GOTO 53007, 52910, 53007
  5334.       GOTO 53007
  5335. '
  5336. ' *****************************************************************************
  5337. ' *  N - COMMAND FROM FILES MENU (DISPLAY NEW FILES SINCE LAST DIR DISPLAY)   *
  5338. ' *****************************************************************************
  5339. '
  5340. 53000 CK = 1
  5341.       IF Q > 1 THEN _
  5342.          GOTO 53005
  5343. 53002 A1$ = RIGHT$(LM$,4) + LEFT$(LM$,2)
  5344.       A$ = "Include files on/after (MMDDYY, [ENTER] = last date on " + A1$ + ")"
  5345.       GOSUB 12995
  5346.       IF Q = 0 THEN _
  5347.          RS$ = LM$ : _
  5348.          GOTO 53007
  5349.       B$(2) = B$(1)
  5350. 53005 IF LEN(B$(2)) <> 6 THEN _
  5351.          GOTO 53002
  5352.       A1$ = B$(2)
  5353.       RS$ = RIGHT$(A1$,2) + LEFT$(A1$,4)
  5354. 53007 IF Q > 2 THEN _
  5355.          DIR.INDEX = 3 : _
  5356.          GOTO 53030
  5357. 53010 A$ = "Directory(s) to scan or ALL"
  5358.       GOSUB 12995
  5359.       IF Q = 0 THEN _
  5360.          RETURN
  5361.       DIR.INDEX = 1
  5362. 53030 LAST.DIR.POS = Q
  5363.       LIST.DIRECTORY = TRUE
  5364.       LIST.NEW = TRUE
  5365. 53035 CALL ALLCAPS (B$(DIR.INDEX))
  5366.       Z$ = B$(DIR.INDEX)
  5367.       IF Z$ = "ALL" THEN _
  5368.          GOTO 53070
  5369. 53060 X = DIR.INDEX
  5370.       QX = X
  5371.       GOSUB 20161
  5372.       DIR.INDEX = DIR.INDEX + 1
  5373.       IF DIR.INDEX <= LAST.DIR.POS THEN _
  5374.          GOTO 53035
  5375.       LIST.NEW = FALSE
  5376.       RETURN
  5377. 53070 G = DIR.INDEX
  5378.       J = DIR.INDEX
  5379.       FOR SUBDIR.INDEX = 1 TO SUBDIR.COUNT
  5380.         B$(DIR.INDEX) = SUBDIR$(SUBDIR.INDEX) + _
  5381.                 "*." + _
  5382.                 DIRECTORY.EXTENTION$
  5383.         GOSUB 10720
  5384.         CLS
  5385.       NEXT
  5386.       SUBROUTINE.PARAMETER = 1
  5387.       CALL LINE25
  5388.       QX = G
  5389.       X = DIR.INDEX+1
  5390.       GOSUB 20161
  5391.       LIST.NEW = FALSE
  5392.       RETURN
  5393. '
  5394. ' *****************************************************************************
  5395. ' *  OPEN AND DEFINE CALLERS FILE                                             *
  5396. ' *****************************************************************************
  5397. '
  5398. 56000 CLOSE 4
  5399.       OPEN "R",4,CALLERS.FILE$,64
  5400.       FIELD 4,64 AS CALLERS.RECORD$
  5401.       RETURN
  5402. '
  5403. ' *****************************************************************************
  5404. ' *  DISPLAY CALLERS FILE                                                     *
  5405. ' *****************************************************************************
  5406. '
  5407. 57000 CALL SKIPLINE
  5408.       CALLERS.FILE.INDEX.TEMP = CALLERS.FILE.INDEX
  5409. 57005 IF CALLERS.FILE.INDEX.TEMP  < 1 OR _
  5410.          RET THEN _
  5411.          RETURN
  5412. 57010 GET 4,CALLERS.FILE.INDEX.TEMP
  5413.       A$ = CALLERS.RECORD$
  5414.       IF LEFT$(A$,3) = SPACE$(3) OR _
  5415.          INSTR(A$,"on at") = 0 THEN _
  5416.          GOTO 57030
  5417. 57025 CALLERS.FILE.INDEX.TEMP = CALLERS.FILE.INDEX.TEMP -1
  5418.       GET 4,CALLERS.FILE.INDEX.TEMP
  5419.       A1$ = LEFT$(CALLERS.RECORD$,15)
  5420.       IF SYSOP OR _
  5421.          LEFT$(A1$,3) <> SPACE$(3) THEN _
  5422.          A$ = A$ + A1$
  5423. 57027 GOSUB 57100
  5424.       GOTO 57045
  5425. 57030 IF SYSOP THEN _
  5426.          GOSUB 57100
  5427. 57045 CALLERS.FILE.INDEX.TEMP = CALLERS.FILE.INDEX.TEMP -1
  5428.       GOTO 57005
  5429. 57100 GOSUB 12979
  5430. 57110 IF PAGE.LENGTH AND _
  5431.          Q >= 0 THEN _
  5432.          Q = Q + 1 : _
  5433.          IF Q > PAGE.LENGTH THEN _
  5434.             GOSUB 5600 : _
  5435.             IF NO THEN _
  5436.                RETURN 57120 _
  5437.             ELSE Q = 0
  5438. 57120 RETURN
  5439. '
  5440. ' *****************************************************************************
  5441. ' *  TEST FOR FUNCTION KEY PRESSED                                            *
  5442. ' *****************************************************************************
  5443. '
  5444. 60000 CALL FINDFUNC
  5445. 60010 IF LEN(KEY.PRESSED$) <> 2 THEN _
  5446.          RETURN
  5447.       ON FUNCTION.KEY GOSUB 31000, _            ' F1
  5448.                             32000, _            ' F2
  5449.                             33000, _            ' F3
  5450.                             33040, _            ' F4
  5451.                             33060, _            ' F5
  5452.                             33070, _            ' F6
  5453.                             33090, _            ' F7
  5454.                             33110, _            ' F8
  5455.                             33130, _            ' F9
  5456.                             33150, _            ' F10
  5457.                             1398, _             ' END KEY
  5458.                             33200, _            ' PGUP
  5459.                             33300               ' PGDN
  5460.       RETURN
  5461. '
  5462. ' *****************************************************************************
  5463. ' *  MULTI-LINK DEQUEUE COM PORT                                              *
  5464. ' *****************************************************************************
  5465. '
  5466. 60500 AX = &H100
  5467. 60505 BX = -4
  5468.       IF COM.PORT$ = "COM2" THEN _
  5469.          BX = -3
  5470. '
  5471. ' *****************************************************************************
  5472. ' *  MULTI-LINK INTERFACE                                                     *
  5473. ' *****************************************************************************
  5474. '
  5475. 60510 CALL RBBSML(AX,BX)
  5476.       RETURN
  5477. '
  5478. ' *****************************************************************************
  5479. ' *  REPLY TO MESSAGE SAVE ORIGINAL ATTRIBUTES                                *
  5480. ' *****************************************************************************
  5481. '
  5482. 62520 SQ = Q
  5483.       LG$(10) = B$
  5484.       LINES.IN.MESSAGE.SAVE = LINES.IN.MESSAGE
  5485.       SL = S
  5486.       NON.STOP.SAVE = NON.STOP
  5487.       MESSAGE.DIM.INDEX.SAVE = MESSAGE.DIM.INDEX
  5488.       RETURN
  5489. '
  5490. ' *****************************************************************************
  5491. ' *  REPLY TO MESSAGE RESTORE ORIGINAL ATTRIBUTES                             *
  5492. ' *****************************************************************************
  5493. '
  5494. 62530 Q = SQ
  5495.       B$ = LG$(10)
  5496.       LINES.IN.MESSAGE = LINES.IN.MESSAGE.SAVE
  5497.       S = SL
  5498.       NON.STOP = NON.STOP.SAVE
  5499.       MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX.SAVE
  5500.       KILL.MESSAGE = FALSE
  5501.       RETURN